社区讨论
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请原谅我的一些非常规写法,比如用queue来储存所有的节点到根节点的异或和
#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;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...