RT, POJ3764 TLE
#include <iostream>
#include <vector>
#include <utility>
#include <algorithm>
#pragma GCC optimize(3)
// #define end EioorsojNfoijDewr
#define int long long
using namespace std;
int d[1000001][2], endd[1000001];
int tot = 2;
void add(int x){
int p = x;
vector<int> vec;
while(p){
vec.push_back(p % 2);
p /= 2;
}
while(vec.size() <= 35){
vec.push_back(0);
}
reverse(vec.begin(), vec.end());
p = 1;
for(int i = 0;i <= 35;i++){
// cout << vec[i];
if(!d[p][vec[i]]){
d[p][vec[i]] = tot;
tot++;
}
p = d[p][vec[i]];
}
//cout << endl;
endd[p] = 1;
}
int search(int x){
int p = x;
vector<int> vec;
while(p){
vec.push_back(p % 2);
p /= 2;
}
while(vec.size() <= 35){
vec.push_back(0);
}
reverse(vec.begin(), vec.end());
p = 1;
int ans = 0;
for(int i = 0;i <= 35;i++){
// cout << (vec[i] ^ 1);
if(d[p][vec[i] ^ 1]){
// cout << "|";
ans |= (1LL << (36 - i - 1));
p = d[p][vec[i] ^ 1];
}
else{
p = d[p][vec[i]];
}
}
//cout << endl;
return ans;
}
// Trees.
// Do the querys
vector<pair<int, int> > gv[100001];
int xors[100001];
void add_edge(int u, int v, int w){
gv[u].push_back(make_pair(v, w));
gv[v].push_back(make_pair(u, w));
}
void dfs(int n, int fa){
for(int i = 0;i < gv[n].size();i++){
if(gv[n][i].first == fa){
continue;
}
xors[gv[n][i].first] = xors[n] ^ gv[n][i].second;
dfs(gv[n][i].first, n);
}
}
signed main(){
// memset(d, 0, sizeof(d));
int n;
cin >> n;
for(int i = 0;i < n - 1;i++){
int u, v, w;
cin >> u >> v >> w;
add_edge(u, v, w);
}
dfs(0, -1);
int maxv = 0;
for(int i = 0;i < n;i++){
// cout << xors[i] << " ";
add(xors[i]);
maxv = max(maxv, search(xors[i]));
}
cout << maxv << endl;
return 0;
}