46pts求助
查看原帖
46pts求助
342494
wxh666楼主2023/7/15 09:38

https://www.luogu.com.cn/record/115609691

#include<bits/stdc++.h>
using namespace std;
namespace lsq
{
    struct lq{
        struct lqbz {
            int v,w,nxt;
        }e[2000005];
        int h[1000005],cnt;
        inline void add(int u,int v,int w=1) {
            e[++cnt].v=v;
            e[cnt].w=w;
            e[cnt].nxt=h[u];
            h[u]=cnt;
        }
    }g;
};
bool vis[100005];
using namespace lsq;
struct trie{
    int to[2];
    int d;
}e[3000005];
int ecnt=1;
int n;
int x,y,z;
void add(int cnt)
{
    int i=1;
    for(int k=31;k>=0;i=e[i].to[(cnt>>k)&1],k--)
        if(!e[i].to[(cnt>>k)&1]) e[i].to[(cnt>>k)&1]=++ecnt;
}
void dfs(int t,int cnt)
{
    add(cnt);
    for(int j=g.h[t],v=g.e[j].v,w=g.e[j].w;j;j=g.e[j].nxt,v=g.e[j].v,w=g.e[j].w)
    {
        if(vis[v]) continue;
        vis[v]=true;
        dfs(v,cnt^w);
    }
}
int ans;
void dfs2(int i,int j,int k,int cnt)
{
    if(e[i].to[0]&&e[j].to[1])
        dfs2(e[i].to[0],e[j].to[1],k-1,cnt|=(1<<k));
    if(e[i].to[1]&&e[j].to[0])
        dfs2(e[i].to[1],e[j].to[0],k-1,cnt|=(1<<k));
    if(((!e[i].to[1])||(!e[j].to[0]))||((!e[i].to[0])&&(!e[j].to[1])))
    {
        if(e[i].to[1]&&e[j].to[1])
            dfs2(e[i].to[1],e[j].to[1],k-1,cnt);
        if(e[i].to[0]&&e[j].to[0])
            dfs2(e[i].to[0],e[j].to[0],k-1,cnt);
    }
    if(k<=1)
    {
        ans=max(ans,cnt);
        return;
    }
}
signed main()
{
    cin>>n;
    for(int i=2;i<=n;i++)
    {
        int p=scanf("%d%d%d",&x,&y,&z);
        g.add(x,y,z);
        g.add(y,x,z);
    }
    dfs(1,0);
    dfs2(1,1,31,0);
    cout<<ans<<endl;
    return 0;
}
2023/7/15 09:38
加载中...