28pts求助
查看原帖
28pts求助
767353
Oct0pus1楼主2023/1/20 13:56
#include<bits/stdc++.h>
using namespace std;
const int L=1e5+10;
#define int long long
struct edge{
	int to,val;
};
vector<edge> e[L];
int n,sum[L],nxt[L*32][2],tot,ans;
inline void dfs(int u,int fa){
	for(int i=0;i<e[u].size();i++){
		int v=e[u][i].to;
		if(v!=fa){
			sum[v]=sum[u]^e[u][i].val;
			dfs(v,u);
		}
	}
}
inline void add(int x){
	int p=0;
	for(int i=31;i>=0;i--){
		int c=(x&((int)1<<i))?1:0;
//		printf("%d",c);
		if(!nxt[p][c])nxt[p][c]=++tot;
		p=nxt[p][c];
	}
}
inline int query(int x){
	int bits=log2(x),p=0,ret=0;
	for(int i=31;i>=0;i--){
		int c=(x&((int)1<<i))?0:1;
		if(nxt[p][c]){
			ret+=1<<i;
			p=nxt[p][c];
		}else if(nxt[p][!c])p=nxt[p][c];
		else return ret;
	}
	return ret;
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<n;i++){
		int u,v,w;
		scanf("%lld%lld%lld",&u,&v,&w);
		e[u].push_back((edge){v,w});
		e[v].push_back((edge){u,w});
	}
	dfs(1,0);
	for(int i=1;i<=n;i++)add(sum[i]);
	for(int i=1;i<=n;i++)ans=max(ans,query(sum[i]));
	printf("%lld",ans);
	return 0;
}
2023/1/20 13:56
加载中...