我用tuple排序代替dfs的代码在你谷上可以ac,但是看了眼lyd书上的原版数据,我的代码对于其中一个数据是错误的。所以建议把这个数据加上。顺便问一下为什么这个代码会无法通过那个数据。
#include "cstdio"
#include "tuple"
#include "algorithm"
std::tuple<int,int,int> stick[100005];
int n;
int D[100005];
int trie[32*100005][2];
int r=1;
int main(){
scanf("%d",&n);
int c =0;
for(int i=1;i<n;i++){
c++;
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
stick[c] = {u,v,w};
}
std::sort(stick+1,stick+c+1);
for(int i=1;i<=c;i++){
int u = std::get<0>(stick[i]);
int v = std::get<1>(stick[i]);
int w = std::get<2>(stick[i]);
D[v] = D[u] ^ w;
}
//find D[x]
int max=0;
for(int i=0;i<=n;i++){
int p=1;
int x=D[i];
int num=0;
for (int k = 31; k >= 0; k--) {
int ch = x >> k & 1;
if (!trie[p][ch]) {
trie[p][ch] = r+1;
r++;
}
p = trie[p][ch];
}
x=D[i];
if(i!=0){
p=1;
for (int k = 31; k >= 0; k--) {
int ch = x >> k & 1;
if (trie[p][ch ^ 1]) {
p = trie[p][ch ^ 1];
num |= 1 << k;
} else {
p = trie[p][ch];
}
}
}
if(max<num){
max=num;
}
}
printf("%d",max);
}