Trie

2020-03-13  本文已影响0人  Tsukinousag
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int ne[N<<1],e[N<<1],h[N],w[N<<1];
int son[N*32][2],idx;
int dp[N];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int fa,int sum)//当前节点,父节点.
{
    dp[u]=sum;
    for(int i=h[u];~i;i=ne[i])
    {
        int v=e[i];
        if(v!=fa)
            dfs(v,u,sum^w[i]);
    }
}
void Insert(int k)
{
    int p=0;
    for(int i=30;~i;i--)
    {
       int temp=k>>i&1;
       if(!son[p][temp])
           son[p][temp]=++idx;
       p=son[p][temp];
    }
}
int Query(int k)
{
    int p=0,res=0;
    for(int i=30;~i;i--)
    {
        int temp=k>>i&1;
        if(son[p][!temp])
        {
            res+=1<<i;
            p=son[p][!temp];
        }
        else
            p=son[p][temp];
    }
    return res;
}
int main()
{
    int n;
    cin>>n;
    memset(h,-1,sizeof h);
    for(int i=0;i<n-1;i++)
    {
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);
        add(y,x,z);
    }
    dfs(0,-1,0);
    for(int i=0;i<n;i++)
        Insert(dp[i]);
    int ans=0;
    for(int i=0;i<n;i++)
        ans=max(ans,Query(dp[i]));
    cout<<ans<<endl;
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读