zoukankan      html  css  js  c++  java
  • 最大异或对 tire树

    在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?

    输入格式
    第一行输入一个整数N。

    第二行输入N个整数A1~AN。

    输出格式
    输出一个整数表示答案。

    数据范围
    1≤N≤105,
    0≤Ai<231
    输入样例:
    3
    1 2 3
    输出样例:
    3
    直接暴力的复杂度是n²肯定是要超时的 ,知道要用字典树那么就把每个数化成二进制保存啦,因为是异或运算,相同为0不同为1 ,所以在每个节点要优先向相反位走,相反位没路了再向相同为走,为了实现最大化要从高位向低位走(wa了好几次!!!)

    #include<iostream>
    #include<map>
    using namespace std;
    const int maxn=1e5+100;
    int ed[maxn*32][5],idx=1;//理论上一个数有32位 实际用不到maxn*32
    void insert(int x)
    {
        int p=1;
        for(int i=31;i>=0;i--)
        {
            int y=x>>i&1;//取出每一位的值(二进制)
            if(!ed[p][y]) ed[p][y]=++idx;
            p=ed[p][y];
        }
    }
    int query(int x)
    {
        int p=1,i=31,ans=0;
        while(i>=0)
        {
            int y=x>>i&1;
            if(ed[p][1-y]) ans+=1<<i,p=ed[p][1-y];//优先考虑相反位
            else  p=ed[p][y];
            i--;
        }
        return ans;
    }
    int main()
    {
        // ios::sync_with_stdio(false);
        // cin.tie(0);
        // cout.tie(0);
        int n,ans=0;
        cin>>n;
        for(int i=0;i<n;i++)
        {
            int x;
            cin>>x;
            insert(x);
            ans=max(ans,query(x));
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    每天一个linux命令(6):mv命令
    每天一个linux命令(5):rm 命令
    每天一个linux命令(4):mkdir命令
    每天一个linux命令(3):pwd命令
    每天一个linux命令(2):cd命令
    每天一个linux命令(1):ls命令
    Linux下svn命令详解
    Linux下SVN安装配置
    SVN命令使用详解
    分布式Web服务器架构
  • 原文地址:https://www.cnblogs.com/neflibata/p/12871799.html
Copyright © 2011-2022 走看看