建立、搜寻字典树的时候要从二进制的高位往低位搜!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const int MAXN=1e5+10,MAXM=1e7+10;
int N,u,v,f[MAXM][2];
int head[MAXN],to[MAXN<<1],nxt[MAXN<<1],cnt;
ll dis[MAXN],w,va[MAXN<<1];
ll s[MAXN][32],ans[32],ma,tot;
void add(int u,int v,int w){
nxt[++cnt]=head[u];
to[cnt]=v;
va[cnt]=w;
head[u]=cnt;
}
void dfs(int x,int fa){
for(int i=head[x];i;i=nxt[i]){
int now=to[i];
if(now==fa) continue;
dis[now]=dis[x]^va[i];
dfs(now,x);
}
}
void Insert(ll s[],int id,int step){
ll x=s[step];
if(!f[id][x]) f[id][x]=++tot;
if(!step) return;
Insert(s,f[id][x],step-1);
}
void find(ll s[],int id,int step){
int x=s[step]^1;
if(!f[id][x]) x^=1;
ans[step]=s[step]^x;
if(!step) return;
find(s,f[id][x],step-1);
}
int main(){
scanf("%d",&N);
for(int i=1;i<N;++i){
scanf("%d%d%lld",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
dfs(1,0);
for(int i=1;i<=N;++i){
for(int j=0;j<=31;++j){
s[i][j]=dis[i]%2;
dis[i]>>=1;
}
// for(int j=30;j>=0;--j) cout<<s[i][j];
// cout<<'\n';
Insert(s[i],0,31); //bro当时是从0往30搜的,所以错了
}
for(int i=1;i<=N;++i){
find(s[i],0,31);
ll x=0;
for(int j=31;j>=0;--j){
// cout<<ans[j];
x=(x<<1)+ans[j];
}
// printf("(%d)\n",x);
ma=max(ma,x);
}
printf("%lld",ma);
return 0;
}