1 条题解

  • 0
    @ 2023-8-30 17:09:53

    image

    #include<bits/stdc++.h>
    using namespace std;
    int const N=100010,M=31*N;
    int n,a[N],son[M][2],idx=1,ans,s,t,k;
    vector<pair<int,int>> e[N];
    void insert(int x){
        int p=1;  //根节点
        for(int i=30;i>=0;i--){
            int u=x>>i&1;   
            if(!son[p][u]) son[p][u]=++idx; //如果插入中发现没有该子节点,开出这条路
            p=son[p][u]; //指针指向下一层
        }
    }
    int search(int x){
        int p=1;int res=0;
        for(int i=30;i>=0;i--){ //从最大位开始找
            int u=x>>i&1;
            if(son[p][!u]){ //如果当前层有对应的不相同的数
    		    //p指针就指到不同数的地址
              p=son[p][!u];
              res=res*2+1;//*2相当左移一位  然后如果找到对应位上不同的数res+1 
            }                                                       
            else {                                                                                                                    
                p=son[p][u];
                res=res*2+0;
            }
        }
        return res;
    }
    void dfs(int u,int fa){
    	ans=max(ans,search(a[u]));
    	insert(a[u]);
    	for (auto &i:e[u]){
    		int v=i.first;
    		int w=i.second;
    		if (v==fa) continue;
    		a[v]=a[u]^w;
    		dfs(v,u);
    	}
    }
    int main(void){
        cin>>n;
        for (int i=1;i<n;++i){
    		cin>>s>>t>>k;
    		e[s].push_back({t,k});
    		e[t].push_back({s,k});
    	}
    	dfs(1,0);
    	cout<<ans;
    }
    
    • 1

    信息

    ID
    485
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    28
    已通过
    21
    上传者