LuoguP4551(Trie树)

链接:点击打开链接

题意:给定一棵N个点的带权树,结点下标从1开始到N。寻找树中找两个结点,求最长的异或路径。

异或路径指的是指两个结点之间唯一路径上的所有边权的异或。

代码:

#include
using namespace std;

typedef long long ll;

const int siz=100005;
struct node{
    ll v,w;
};
vector G[siz];
ll rt,ans,a[35],tr[35*siz][2];
void in(ll x){
    ll i,u,pos;
    pos=0;
    for(i=0;i<35;i++)
    a[i]=0;
    while(x){
        a[pos++]=x&1LL;
        x>>=1LL;
    }
    u=0;
    for(i=34;i>=0;i--){
        if(tr[u][a[i]]==0)
        tr[u][a[i]]=++rt;
        u=tr[u][a[i]];
    }
}
ll sol(ll x){
    ll i,u,v,pos,ans;
    pos=0;
    for(i=0;i<35;i++)
    a[i]=0;
    while(x){
        a[pos++]=x&1;
        x>>=1;
    }
    u=ans=0;
    for(i=34;i>=0;i--){
        v=a[i]^1;
        if(tr[u][v]!=0){
            ans=(ans<<1)|1;
            u=tr[u][v];
        }
        else{
            ans<<=1;
            u=tr[u][a[i]];
        }
    }
    return ans;
}
void dfs(ll s,ll fa,ll sum){
    ll i,v,w;
    for(i=0;i

 

你可能感兴趣的:(---------Trie树,洛谷)