建议加强数据
查看原帖
建议加强数据
585201
6lszxz楼主2022/5/31 16:31

我用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);

}
2022/5/31 16:31
加载中...