链接:点击打开链接
题意:给定一棵个点的带权树,结点下标从开始到。寻找树中找两个结点,求最长的异或路径。
异或路径指的是指两个结点之间唯一路径上的所有边权的异或。
代码:
#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