• LuoguP4551最长异或路径


    LuoguP4551最长异或路径

    题面

    题目链接

    题解

    01 Trie

    题目要求求树上的最长异或路径

    很容易想到树上差分

    处理每个点的根节点的异或和

    讲异或和存进Trie树

    按为贪心即可

    代码如下:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    const int MAXN = 100000 + 10;
    
    inline int read()
    {
        int f=1,x=0;
        char ch;
        do
        {
            ch=getchar();
            if(ch=='-') f=-1;
        }while(ch<'0'||ch>'9');
        do
        {
            x=(x<<3)+(x<<1)+ch-'0';
            ch=getchar();
        }while(ch>='0'&&ch<='9');
        return f*x;
    } 
    
    struct node
    {
        int to;
        int next;
        int val;
    }g[MAXN*2];
    
    int n;
    int head[MAXN*2],cnt=0;
    int sum[MAXN*2],siz=0;
    int t[MAXN*31 + 10][2];
    
    inline void addedge(int a,int b,int c)
    {
        ++cnt;g[cnt].to=b;g[cnt].val=c;g[cnt].next=head[a];head[a]=cnt;return;
    }
    
    inline void dfs(int x,int fa)
    {
        for(int i=head[x];i>0;i=g[i].next)
        {
            int v=g[i].to;
            if(v==fa) continue;
            sum[v]=sum[x]^g[i].val;
            dfs(v,x);
        }
    }
    
    inline void insert(int x,int cur)
    {
        bool ch;
        for(int i=30;i>=0;i--)
        {
            ch=(x&(1<<i))>>i;
            if(t[cur][ch]==0)
            {
                t[cur][ch]=++siz;
            }
            cur=t[cur][ch];
        }
        
    }
    
    inline int query(int x)
    {
        int cur=0,ans=0;
        bool ch;
        for(int i=30;i>=0;i--)
        {
            ch=(x&(1<<i))>>i;
            if(t[cur][ch^1]!=0)
            {
                ans+=(1<<i);
                cur=t[cur][ch^1];
            }
            else cur=t[cur][ch];
        }
        return ans;
    }
    
    int main()
    {
        n=read();
        for(register int i=1;i<n;i++)
        {
            int u=read(),v=read(),w=read();
            addedge(u,v,w);
            addedge(v,u,w);
        }
        dfs(1,0);
        for(int i=1;i<=n;i++)
        {
            insert(sum[i],0);
        }
        int ans=0;
        for(int i=1;i<=n;i++) ans=max(ans,query(sum[i]));
        cout<<ans<<endl;
    }
  • 相关阅读:
    iOS 11 application 新特性
    Swift循环遍历集合方法
    Swift 使用 #warning
    swift 3.0 正则表达式查找/替换字符
    App Store 审核指南
    iOS 获取设备的各种信息的方法
    闭包(Closure)
    Swift的Guard语句
    Swift 学习指引
    Swift 4.0 废弃的柯里化
  • 原文地址:https://www.cnblogs.com/wlzs1432/p/11286091.html
Copyright © 2020-2023  润新知