近视后人
查看原帖
近视后人
1496406
_chuan楼主2025/7/22 19:16

建立、搜寻字典树的时候要从二进制的高位往低位搜!!!

(不然只能过#1 #10 #11)
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const int MAXN=1e5+10,MAXM=1e7+10;

int N,u,v,f[MAXM][2];
int head[MAXN],to[MAXN<<1],nxt[MAXN<<1],cnt;
ll dis[MAXN],w,va[MAXN<<1];
ll s[MAXN][32],ans[32],ma,tot;

void add(int u,int v,int w){
	nxt[++cnt]=head[u];
	to[cnt]=v;
	va[cnt]=w;
	head[u]=cnt;
}
void dfs(int x,int fa){
	for(int i=head[x];i;i=nxt[i]){
		int now=to[i];
		if(now==fa) continue;
		dis[now]=dis[x]^va[i];
		dfs(now,x);
	}
}

void Insert(ll s[],int id,int step){
	ll x=s[step];
	if(!f[id][x]) f[id][x]=++tot;
	if(!step) return;
	Insert(s,f[id][x],step-1);
}

void find(ll s[],int id,int step){
	int x=s[step]^1;
	if(!f[id][x]) x^=1;
	ans[step]=s[step]^x;
	if(!step) return;
	find(s,f[id][x],step-1);
}

int main(){
	scanf("%d",&N);
	for(int i=1;i<N;++i){
		scanf("%d%d%lld",&u,&v,&w);
		add(u,v,w);add(v,u,w);
	}
	dfs(1,0);
	for(int i=1;i<=N;++i){
		for(int j=0;j<=31;++j){
			s[i][j]=dis[i]%2;
			dis[i]>>=1;
		}
//		for(int j=30;j>=0;--j) cout<<s[i][j];
//		cout<<'\n';
		Insert(s[i],0,31);        //bro当时是从0往30搜的,所以错了 
	}
	for(int i=1;i<=N;++i){
		find(s[i],0,31);
		ll x=0;
		for(int j=31;j>=0;--j){
//			cout<<ans[j];
			x=(x<<1)+ans[j];
		}
//		printf("(%d)\n",x);
		ma=max(ma,x);
	}
	printf("%lld",ma);
	return 0;
}
2025/7/22 19:16
加载中...