前置知识:01trie树
分析:
- 01trie树提供给我们的功能为我们塞进去一些数,然后我们可以logn内查询与其最大的异或和值。
- 那不刚好可以满足我们o(n^2)暴力吗。。
#include<bits/stdc++.h>
typedef long double ld;
#define INF (1ll<<60)-1
const int M=1e6+6;
#define MP make_pair
#define pb push_back
using namespace std;
const int N=1e5+5;
int num[M],cnt=1;
int d[M][2];
int tot,ans;
vector< pair<int,int> >g[N];
void update(int x){
int p=1;
for(int i=31;i>=0;i--){
if(d[p][(x>>i)&1]==0) d[p][(x>>i)&1]=++cnt;
p=d[p][(x>>i)&1];
num[p]++;
}
}
int query(int x){
int res=0;
int p=1;
for(int i=31;i>=0;i--){
int t=(x>>i)&1;
if(num[d[p][1^t]]) p=d[p][1^t],res+=(1<<i);
else p=d[p][t];
}
return res;
}
void dfs(int u,int fa,int dis){
update(dis);
for(auto it:g[u]){
int v=it.first,w=it.second;
if(v!=fa)
dfs(v,u,dis^w);
}
}
void dfs2(int u,int fa,int dis){
ans=max(ans,max(query(dis),dis));
for(auto it:g[u]){
int v=it.first,w=it.second;
if(v!=fa)
dfs2(v,u,dis^w);
}
}
int main(){
int n;
scanf("%d",&n);
for(int u,v,w,i=1;i<n;i++){
scanf("%d%d%d",&u,&v,&w);
g[u].pb(MP(v,w));
g[v].pb(MP(u,w));
}
dfs(1,0,0);
dfs2(1,0,0);
printf("%d\n",ans);
return 0;
}

京公网安备 11010502036488号