社区讨论

01Trie,开O2全RE,不开O2WA#2~10

P4551最长异或路径参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhji1l9b
此快照首次捕获于
2025/11/04 02:54
4 个月前
此快照最后确认于
2025/11/04 02:54
4 个月前
查看原帖
CPP
#include <iostream>
#include <vector>
#include <utility>
#include <queue>
using namespace std;
const long long N=31e5+10;
long long tr[N][2];//01trie
//#define end end0
//long long end[N];
long long tot;
long long n,x,y,z;
vector<pair<long long,long long> > G[500005];
queue<long long> q;
void newtr()
{
	tot=1;
	//end[tot]=0;
	for(long long i=0;i<=1;i++) 
	{
		tr[tot][i]=(-1);
	}
}
long long add()
{
	tot++;
	//end[tot]=0;
	for(long long i=0;i<=1;i++)
	{
		tr[tot][i]=(-1);
	}
	return tot;
}
void ins(long long x)
{
	long long now=1;
	for(long long i=(1<<31);i>=1;i>>=1)
	{
		long long t=x&i;
		if(tr[now][t]==(-1)) tr[now][t]=add();
		now=tr[now][t];
		//x>>=1;
	}
	//end[now]+=1;
}
long long query(long long x)
{
	long long now=1;
	long long ret=0;
	for(long long i=(1<<31);i>=1;i>>=1)
	{
		if(now==(-1)) return ret;
		long long t=x&i;
		bool opposite=0;
		for(long long j=0;j<=1;j++)
		{
			if(j!=t&&tr[now][j]!=(-1))
			{
			    now=tr[now][j]; 
			    opposite=1;
			    ret=(ret<<1)+1;
			}
		}
		now=tr[now][t];
		ret<<=1;
	}
}
void dfs(long long x,long long fa,long long ans)
{
	if(G[x].size()==1&&G[x][0].first==fa)
	{
		ins(ans);q.push(ans);
		return;
	}
	for(long long i=0;i<G[x].size();i++)
	{
		if(G[x][i].first!=fa)
		{
			dfs(G[x][i].first,x,ans^G[x][i].second);
		}
	}
}
int main()
{
	cin>>n;
	for(long long i=1;i<n;i++)
	{
		cin>>x>>y>>z;
		G[x].push_back({y,z});
		G[y].push_back({x,z});
	}
	dfs(1,0,0);
	long long ans=0;
	while(!q.empty())
	{
		long long i=q.front();
		q.pop();
		ans=max(query(i),ans);
	}
	cout<<ans;
	
	return 0;
} 
请原谅我的一些非常规写法,比如用queue来储存所有的节点到根节点的异或和

回复

2 条回复,欢迎继续交流。

正在加载回复...