BZOJ_1954_Pku3764 The xor-longest Path_Trie树
Description
给定一棵n个点的带权树,求树上最长的异或和路径
把根到点路径上边权异或和求出来,然后变成了Trie树裸题。
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define N 100050 int head[N],to[N<<1],nxt[N<<1],val[N<<1],a[N],cnt,n; int ch[N*40][2],tot=1; void insert(int x) { int p=1; int i; for(i=30;i>=0;i--) { int &k=ch[p][(x>>i)&1]; if(!k) k=++tot; p=k; } } int solve(int x) { int re=0,p=1,i; for(i=30;i>=0;i--) { int k=!((x>>i)&1); if(ch[p][k]) { re+=1<<i; p=ch[p][k]; }else { p=ch[p][!k]; } } return re; } inline void add(int u,int v,int w) { to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; val[cnt]=w; } int ans; void dfs(int x,int y) { int i; ans=max(ans,solve(a[x])); insert(a[x]); for(i=head[x];i;i=nxt[i]) { if(to[i]!=y) { a[to[i]]=a[x]^val[i]; dfs(to[i],x); } } } int main() { scanf("%d",&n); int i,x,y,z; for(i=1;i<n;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); add(y,x,z); } dfs(1,0); printf("%d\n",ans); }