社区讨论
求助 蒟蒻刚学trie 悬关
P4551最长异或路径参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo2863d5
- 此快照首次捕获于
- 2023/10/23 09:34 2 年前
- 此快照最后确认于
- 2023/11/03 09:48 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,value[100005],root,f[100005][35],cnt,ans,maxx;
vector<int> a[100005];
struct POINT { int son[2]; } q[100005];
void dfs(int x)
{
for(register int i=0;i<a[x].size();++i)
{
value[a[x][i]]=value[a[x][i]]^value[x];
dfs(a[x][i]);
}
}
void push(int x)
{
int last=0;
for(register int i=1;i<=30;++i)
{
if(q[last].son[f[x][i]]==0) q[last].son[f[x][i]]=++cnt;
last=q[last].son[f[x][i]];
}
}
void find(int x,int y,int i)//第i个点 正在找第x位了
{
// cout<<x<<" "<<y<<" "<<i<<" "<<f[i][x]<<" ";
// cout<<q[y].son[0]<<" "<<q[y].son[1]<<" "<<ans<<" ";
if(x==31) return;
if(q[y].son[1-f[i][x]]!=0) { ans+=(long long)pow(2,30-x),find(x+1,q[y].son[1-f[i][x]],i); }
else { find(x+1,q[y].son[f[i][x]],i); }
}
//void print(int x)
//{
// cout<<x<<endl;
// if(q[x].son[0]!=0) { cout<<x<<" 0 "; print(q[x].son[0]); }
// if(q[x].son[1]!=0) { cout<<x<<" 1 "; print(q[x].son[1]); }
//}
int main()
{
cin>>n;
for(register int i=1;i<n;++i)
{
int u,v,w;
cin>>u>>v>>w;
a[u].push_back(v); value[v]=w;
}
for(register int i=1;i<=n;++i)
if(value[i]==0) { root=i; break; }
dfs(root);
for(register int i=1;i<=n;++i)
{
int t=0;maxx=max(maxx,value[i]);
while(value[i]>0)
f[i][30-t]=value[i]%2,value[i]/=2,t++;
}
// for(register int i=1;i<=n;++i)
// {
// for(register int j=1;j<=30;++j)
// cout<<f[i][j]<<" ";
// cout<<endl;
// }
for(register int i=1;i<=n;++i)
{
if(i==root) continue;
push(i);
}
for(register int i=1;i<=n;++i)
{
if(i==root) continue;
ans=0; find(1,0,i);
maxx=max(maxx,ans);
// cout<<endl<<ans<<endl;
}
cout<<maxx;
// print(root);
return 0;
}
/*
6
1 2 7
2 5 1
1 3 8
3 4 10
3 6 14
*/
回复
共 0 条回复,欢迎继续交流。
正在加载回复...