#include<stdio.h> #include<algorithm> #include<string.h> #include<map> #include<vector> using namespace std; int n; struct Edge { int u,v; int next; int w; }edge[400005]; long long a[400005]; int cnt=0; int cntc=0; int e; int head[200005]; long long sum=0; int vis[200005]; struct node { int a[3]; int num; }t[200005*10]; void addEdge(int u,int v,int w) { edge[e].v=v;edge[e].next=head[u];edge[e].w=w;head[u]=e++; edge[e].v=u;edge[e].next=head[v];edge[e].w=w;head[v]=e++; } void insert(long long x,int u,int wei) { for(int i=wei;i>=0;i--) { int k=(1<<i)&x; if(k>0)k=1; if(t[u].a[k]==-1) t[u].a[k]=++cnt; u=t[u].a[k]; } t[u].num=x; } void query(long long x,int u,int wei) { for(int i=wei;i>=0;i--) { long long k=(1<<i)&x; if(k>0)k=1; k=!k; if(t[u].a[k]!=-1) u=t[u].a[k]; else u=t[u].a[!k]; } sum=max(sum,x^t[u].num); } void dfs(int u,int fa,long long sum) { vis[u]=1; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; int w=edge[i].w; long long summ=sum^w; a[++cntc]=summ; if(!vis[v]) dfs(v,u,summ); } } int main() { while(scanf("%d",&n)!=EOF) { sum=0; cntc=0; cnt=0; e=0; memset(head,-1,sizeof(head)); memset(edge,0,sizeof(edge)); memset(t,-1,sizeof(t)); memset(a,0,sizeof(a)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n-1;i++) { int u,v; int x; scanf("%d%d%d",&u,&v,&x); addEdge(u+1,v+1,x); } dfs(1,-1,0); a[++cntc]=0; for(int i=1;i<=cntc;i++) { insert(a[i],0,30); } sum=0; for(int i=1;i<=cntc;i++)query(a[i],0,30); printf("%lld\n",sum); } return 0; }
|