P4551 01trie模板挂了
  • 板块题目总版
  • 楼主Isenthalpic
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/3/20 11:31
  • 上次更新2023/11/5 01:51:25
查看原帖
P4551 01trie模板挂了
194761
Isenthalpic楼主2021/3/20 11:31

55pts,调了一上午了

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int trie[N*35][2],a[N];
int n,tot;
int pre[N<<1],now[N<<1],to[N<<1],val[N<<1],T;
void add(int x,int y,int z){
	pre[++T]=now[x];
	now[x]=T;to[T]=y;
	val[T]=z;
}
void dfs(int u,int fa){
	for(int i=now[u];i;i=pre[i]){
		int v=to[i];
		if(v==fa)continue;
		a[v]=a[fa]^val[i];
		dfs(v,u);
	}
}
void ins(int x){
	int p=0;
	for(int i=30;i>=0;i--){
		int l=x>>i&1;
		if(!trie[p][l])
			trie[p][l]=++tot;
		p=trie[p][l];
	}
}
int query(int x){
	int ret=0,p=0;
	for(int i=30;i>=0;i--){
		int l=x>>i&1;
		if(trie[p][l^1]){
			p=trie[p][l^1];
			ret+=(1<<i);
		}
		else p=trie[p][l];
	}
	return ret;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<n;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);add(v,u,w);
	}
	dfs(1,0);
	int ans=0;
	for(int i=1;i<=n;i++)ins(a[i]);
	for(int i=1;i<=n;i++)ans=max(ans,query(a[i]));
	printf("%d\n",ans);
	return 0;
}
2021/3/20 11:31
加载中...