From《算法竞赛进阶指南》0x16 Trie
/*
若利用朴素暴力的办法时间复杂度为O(N^2)
则可以利用巧妙的数据结构字典树将每个数用32位01表示。
再在每一个数与其余数异或最大,从最高位开始优先选择相反的为异或
*/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 100010, M = 4e6 + 50;
int son[M][2], a[N], idx;
//son数组为字典树,a为所存节点到根节点的异或和,idx为第idx数
int u, v, w;
void insert(int x){
//建立数组字典树模版
int p = 0;
for(int i = 30; ~i; i--){
int &s = son[p][x >> i & 1];
if(!s) s = ++idx;
p = s;
}
}
int query(int x){
//利用字典树模板结合贪心查找最大值
int p = 0, cnt = 0;
for(int i = 30; ~i; i--){
int s = x >> i & 1;
if(son[p][!s]){
cnt += 1 << i;
p = son[p][!s];
}else p = son[p][s];
}
return cnt;
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> u >> v >> w ;
a[v] = a[u] ^ w;//提前求异或和
}
for(int i = 0; i < n; i++){
insert(a[i]);//建立字典树
}
int ans = 0;
for(int i = 0; i < n; i++){
ans = max(ans, query(a[i]));//寻找最大权重和的路径的值
}
cout << ans << endl;
return 0;
}