1 条题解
-
0
#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
- 上传者