挺简单的一个入门题。只要清楚以下几点。
1,一段子串异或和等于两个前缀异或和的异或
2,01字典树的定义
3,会dfs即可
做到以上就没有什么思维难度和代码难度了。
#include "bits/stdc++.h"
using namespace std;
const int N = 1e5 + 5;
int head[N<<1];
long long cnt = 0;
int ch[N * 32][2];
int val[N * 32];
struct node {
int to, next, w;
} a[N<<1];
long long cont = 1;
void build(int x) {
int u = 0;
for (int i = 32; i >= 0; --i) {
int v = (x >> i) & 1;
if (!ch[u][v]) {
ch[cont][1] = ch[cont][0] = val[cont] = 0;
ch[u][v] = cont++;
}
u = ch[u][v];
}
val[u] = x;
}
void add(int u, int v, int w) {
a[++cnt].next = head[u];
a[cnt].to = v;
a[cnt].w = w;
head[u] = cnt;
}
long long sum[N];
void dfs(int u, int fa) {
for (int i = head[u]; i; i = a[i].next) {
int v = a[i].to;
if (v == fa) continue;
sum[v] = sum[u] ^ a[i].w;
dfs(v, u);
}
}
long long query(int x) {
int u = 0;
for (int i = 32; i >= 0; --i) {
int v = (x >> i) & 1;
if (ch[u][v ^ 1]) u = ch[u][v ^ 1];
else u = ch[u][v];
}
return val[u];
}
signed main() {
int n;
cnt = 1;
ch[0][1] = ch[0][0] = 0;
cin >> n;
for (int i = 1; i <= n - 1; ++i) {
int u, v, w;
cin >> u >> v >> w;
add(u, v, w);
add(v, u, w);
}
dfs(0, -1);
for (int i = 0; i < n; ++i) {
build(sum[i]);
}
long long ma = 0;
for (int i = 0; i < n; ++i) {
ma = max(ma, query(sum[i]) ^ sum[i]);
}
cout << ma << endl;
}