01字典树Trie模板poj3764

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;

const int maxn = 1e5 + 5;
const int maxm = 2e5 + 5;

struct Trie {
    int tot, cnt, ans;
    int ch[maxn * 40][2];
    int sum[maxn * 4];
    int b[33];
    int head[maxn];
    struct Edge {
        int val, to, next;

    }edge[maxn * 4];

    void init() {
        tot = cnt = ans = 0;
        memset(head, -1,sizeof(head));
        memset(ch, 0,sizeof(ch));
        memset(sum, 0,sizeof(sum));
    }

    void add(int u, int v, int w) {
        cnt++;
        edge[cnt].val = w;
        edge[cnt].to = v;
        edge[cnt].next = head[u];
        head[u] = cnt;
    }

    void dfs(int u,int p,int wei) {
        sum[u] = wei;
        for(int i = head[u]; ~i; i = edge[i].next) {
            int v = edge[i].to, w = edge[i].val;
            if(v != p) {
                dfs(v, u, sum[u] ^ w);
            }
        }
    }

    void insert(int val) {
        int now = 0;
        for(int i = 0;i <= 31;i++) b[i] = (val >> i) & 1;
        for(int i = 31; ~i; i--) {
            if(!ch[now][b[i]]) ch[now][b[i]] = ++tot;
            now = ch[now][b[i]];
        }
    }

    void find(int val) {
        int now = 0, tmp = 0;
        for(int i = 0;i <= 32;i++) b[i] = (val >> i) & 1;
        for(int i = 31; ~i; i--) {
            if(ch[now][b[i] ^ 1])
                now = ch[now][b[i] ^ 1],
                tmp += (1 << i);
            else
                now = ch[now][b[i]];
        }
        ans = max(ans, tmp);
    }

    int solve(int n) {
        init();
        for(int i = 2, u, v, w;i <= n;i++) {
            scanf("%d%d%d",&u,&v,&w);
            add(u, v, w), add(v, u, w);
        }

        dfs(0, 0 ,0);

        for(int i = 0;i < n; i++) insert(sum[i]);
        for(int i = 0;i < n; i++) find(sum[i]);
        return ans;
    }
}Te;


int main() {
    int n;
    while(~scanf("%d",&n)) {

    printf("%d\n",Te.solve(n));

    }
    return 0;
}

 

posted @ 2019-03-30 23:37  One-Orange  阅读(180)  评论(0)    收藏  举报