码迷,mamicode.com
首页 > 其他好文 > 详细

[POJ3764]The xor-longest Pat【Trie】

时间:2018-07-11 17:06:30      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:oid   http   cin   read   mat   trie   printf   贪心   节点   

  • [POJ3764]The xor-longest Path
    题目大意:给出一棵有\(N\)个节点的树,树上每条边都有一个权值。从树中选择两个点\(x\)\(y\),把\(x\)\(y\)的路径上的所有边权\(xor\),求最大值(\(N\le {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\n", ans);
    }
}

[POJ3764]The xor-longest Pat【Trie】

标签:oid   http   cin   read   mat   trie   printf   贪心   节点   

原文地址:https://www.cnblogs.com/zerolt/p/9295323.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!