调了好久,在本地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点数据的数有一点大,不方便调