代码调不出来了
查看原帖
代码调不出来了
142549
hbhz_zcy楼主2021/3/17 15:54

调了好久,在本地OJ上过了,但洛谷第3点一直过不了
code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxl=32,maxn=200100;
int N,ans=0,f[maxl] ,l[maxn],head[maxn],num=0,vis[maxn];
struct edge{int to,next,l;}e[maxn];
struct node{
    node *son[2];
    node(){memset(son,0,sizeof(son));}
};

void edged(int from,int to,int l){
    e[++num].l=l; e[num].to=to; 
    e[num].next=head[from]; head[from]=num;
}

void dfs(int u){
    vis[u]=1;
    for(int i=head[u];i;i=e[i].next){
        int v=e[i].to;
        if(!vis[v]){
            l[v]=l[u]^e[i].l;
            dfs(v);
        }
    }
    return;
}
/********************************************/
void change(int x){
    memset(f,0,sizeof(f));
    for(int i=maxl-1;x;i--,x>>=1)  f[i]=x&1;
    //for(int i=1;i<=maxl-1;i++)  printf("%d",f[i]);
    //printf("\n");
    return;
}

void add(node *root){
    node *a=root;
    for(int i=0;i<maxl;i++){
        int v=f[i];
        if(a->son[v]==NULL)  a->son[v]=new node;
        a=a->son[v];
    }
    return;
}

void solve(node *root){
    node *a=root;int sum=0;
    for(int i=0;i<maxl;i++){
        bool v=(bool)f[i];
        sum<<=1;
        if(a->son[!v]==NULL)  a=a->son[v];
        else{
            sum|=1;
            a=a->son[!v];
        }
    }
    ans=max(sum,ans);
    return;
}

int main(){
    scanf("%d",&N);N--;
    for(int i=1;i<=N;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        edged(a,b,c);
        edged(b,a,c);
    }
    for(int i=0;i<=N;i++)  if(!vis[i])  dfs(i);
    node *root=new node;
    for(int i=0;i<=N;i++){
        change(l[i]);
        add(root);
        solve(root);
    }
    printf("%d\n",ans);
    //change(ans);
    return 0;
}

第3点数据的数有一点大,不方便调

2021/3/17 15:54
加载中...