https://www.luogu.com.cn/record/115609691
#include<bits/stdc++.h>
using namespace std;
namespace lsq
{
struct lq{
struct lqbz {
int v,w,nxt;
}e[2000005];
int h[1000005],cnt;
inline void add(int u,int v,int w=1) {
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].nxt=h[u];
h[u]=cnt;
}
}g;
};
bool vis[100005];
using namespace lsq;
struct trie{
int to[2];
int d;
}e[3000005];
int ecnt=1;
int n;
int x,y,z;
void add(int cnt)
{
int i=1;
for(int k=31;k>=0;i=e[i].to[(cnt>>k)&1],k--)
if(!e[i].to[(cnt>>k)&1]) e[i].to[(cnt>>k)&1]=++ecnt;
}
void dfs(int t,int cnt)
{
add(cnt);
for(int j=g.h[t],v=g.e[j].v,w=g.e[j].w;j;j=g.e[j].nxt,v=g.e[j].v,w=g.e[j].w)
{
if(vis[v]) continue;
vis[v]=true;
dfs(v,cnt^w);
}
}
int ans;
void dfs2(int i,int j,int k,int cnt)
{
if(e[i].to[0]&&e[j].to[1])
dfs2(e[i].to[0],e[j].to[1],k-1,cnt|=(1<<k));
if(e[i].to[1]&&e[j].to[0])
dfs2(e[i].to[1],e[j].to[0],k-1,cnt|=(1<<k));
if(((!e[i].to[1])||(!e[j].to[0]))||((!e[i].to[0])&&(!e[j].to[1])))
{
if(e[i].to[1]&&e[j].to[1])
dfs2(e[i].to[1],e[j].to[1],k-1,cnt);
if(e[i].to[0]&&e[j].to[0])
dfs2(e[i].to[0],e[j].to[0],k-1,cnt);
}
if(k<=1)
{
ans=max(ans,cnt);
return;
}
}
signed main()
{
cin>>n;
for(int i=2;i<=n;i++)
{
int p=scanf("%d%d%d",&x,&y,&z);
g.add(x,y,z);
g.add(y,x,z);
}
dfs(1,0);
dfs2(1,1,31,0);
cout<<ans<<endl;
return 0;
}