分析
预处理出从根节点到每一个节点路径上所有边权的异或值。因为同一个数异或起来就是0。其实不同的位越靠前就越大。
然后就是最大异或对那道题了
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[200020];
int hd[200020],tot;
int trie[3200020][10];
long long ans;
struct lwx
{
int to,next,w;
}e[200010];
void add(int x,int y,int w)
{
e[++tot]=(lwx){y,hd[x],w};
hd[x]=tot;
}
void dfs(int x,int fa)
{
for(int i=hd[x];i>0;i=e[i].next)
{
if(e[i].to==fa) continue;
a[e[i].to]=a[x]^e[i].w;
dfs(e[i].to,x);
}
}
void in(int t)
{
int now=1;
for(int i=31;i>=0;i--)
{
int ch=(t>>i)&1;
if(!trie[now][ch])
{
trie[now][ch]=++tot;
}
now=trie[now][ch];
}
}
void fd(int t)
{
long long now=1,s=0;
for(int i=31;i>=0;i--)
{
int ch=!((t>>i)&1);
if(trie[now][ch]) s+=(1<<i);
else ch=!ch;
now=trie[now][ch];
}
ans=max(ans,s);
}
int main()
{
cin>>n;
for(int i=1;i<=n-1;i++)
{
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
dfs(1,0);
for(int i=1;i<=n;i++)
{
fd(a[i]);
in(a[i]);
}
cout<<ans;
return 0;
}