[POJ3764]The xor-longest PatTrie
Posted zerolt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[POJ3764]The xor-longest PatTrie相关的知识,希望对你有一定的参考价值。
- [POJ3764]The xor-longest Path
题目大意:给出一棵有(N)个节点的树,树上每条边都有一个权值。从树中选择两个点(x)和(y),把(x)到(y)的路径上的所有边权(xor),求最大值((Nle {10}^5))
令(d[x])为(x)到根的路径(xor),易得(xor_{x->y}=d[x]; xor; d[y]),问题就转化为求最大的(d[x]; xor; d[y]).按位贪心就好
int ch[Maxm][2], cnt;
void cal(int x){
int now=0, p=0;
for(int j=30; j >= 0; j--){
int k=(x&(1<<j)) ? 0 : 1;
if(ch[now][k]) now=ch[now][k], p+=1<<j;
else if(ch[now][k^1]) now=ch[now][k^1];
else break;
}
ans=max(ans, p);
}
void ins(int x){
int now=0;
for(int i=30, v; i >= 0; i--) v=(x&(1<<i)) ? 1 : 0, now=ch[now][v]=ch[now][v] ? ch[now][v] : ++cnt;
}
void dfs(int u, int fa){for(int i=head[u], v; i; i=nxt[i]) if((v=to[i]) != fa) d[v]=d[u]^w[i], dfs(v, u);}
void solve(){
while(cin>>n){
mem(head, 0); mem(nxt, 0); tot=0; mem(ch, 0); cnt=0; mem(d, 0); ans=0;
for(int i=1, u, v, ww; i < n; i++)
u=read()+1, v=read()+1, ww=read(), add(u, v, ww), add(v, u, ww);
dfs(1, 0); for(int i=1; i <= n; i++) ins(d[i]);
for(int i=1; i <= n; i++) cal(d[i]);
printf("%d
", ans);
}
}
以上是关于[POJ3764]The xor-longest PatTrie的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3764 - The xor-longest Path - [DFS+字典树变形]