正题
ybtoj Trie-3
luogu 4551
题目大意
给你一棵树,让你找一条路径,使这条路径的亦或值最大
解题思路
对于每个数存下到根节点的亦或值,然后拿这些数去Trie中跑最大亦或
因为相同部分亦或后为0,所以得出结果就是最大路径亦或值
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 100010
using namespace std;
int n, x, y, z, ans, tot, head[N];
struct rec
{int to, next, l;
}a[N<<1];
struct Trie
{int w, to[N*30][2];void insert(int x){int now = 0, y;for (int i = 30; i >= 0; --i){y = (x>>i)&1;if (!to[now][y]) to[now][y] = ++w;now = to[now][y];}return;}int ask(int x){int ans = 0, now = 0, y;for (int i = 30; i >= 0; --i){y = ((x>>i)&1)^1;if (to[now][y]) ans += 1<<i;else y ^= 1;now = to[now][y];}return ans;}
}T;
void add(int x, int y, int z)
{a[++tot].to = y;a[tot].l = z;a[tot].next = head[x];head[x] = tot;return;
}
void dfs(int x, int y, int fa)
{ans = max(ans, T.ask(y));T.insert(y);for (int i = head[x]; i; i = a[i].next)if (a[i].to != fa)dfs(a[i].to, y^a[i].l, x);return;
}
int main()
{scanf("%d", &n);for (int i = 1; i < n; ++i){scanf("%d%d%d", &x, &y, &z);add(x, y, z);add(y, x, z);}dfs(1, 0, 0);printf("%d", ans);return 0;
}