• 字典树-THE XOR largest pair


    题目:给你n个数字A1,A2....An ,问从中选出两个数字异或运算得到的最大结果是多少 0<=Ai<231

    用字典树,记录每个数字的31位2进制01串(int 为4个字节,每个字节8个二进制,int一共32位,最高位为符号位,所以不考虑)

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5*33;
    int trie[maxn][2];
    int a[maxn];
    int tot=1;
    int main()
    {
        int n;
        cin>>n;
        for(int j=1; j<=n; j++) // 把n个数字的 0 1 串从高位到低位存入字典树 
        {
            cin>>a[j];
            int p=1;
            for(int i=30; i>=0; i--)
            {
                int k=(a[j]>>i)&1;
                if(trie[p][k]==0) trie[p][k]=++tot;
                p=trie[p][k];
            }
        }
        int maxx=0;
        for(int i=1; i<=n; i++) // 对于每个数字 从高位到低位判断每个为0还是1,然后专门找与它不同的往下探索,如果没有不同只能取相同,因为是从高位到低位可以保证得到的t串与这个数字异或得到最大值 
        {
            int p=1;
            int t=0;
            for(int j=30; j>=0; j--)
            {
                int k=(a[i]>>j)&1;
                if(trie[p][k^1])
                {
                    t=(t<<1)+(k^1); // 必须加括号 
                    p=trie[p][k^1];
                }
                else
                {
                    t=(t<<1)+k;  // 必须加括号 
                    p=trie[p][k];
                }
            }
            maxx=max(maxx,t^a[i]);
        }
        cout<<maxx<<endl;
    }
    // 测试数据 
    //10
    //181262 369842 1036879 546331 868986 496157 646816 459571 215643 448018 
    
    //1033222
  • 相关阅读:
    哇~~
    震作震作~~life is only Soso
    真j8无聊
    川行之旅
    可爱的java,我又来看你了,
    暑假周进度总结报告2
    暑假周进度总结报告1
    暑假周进度总结报告3
    2017级软工经验交流体验
    暑假周进度总结报告4
  • 原文地址:https://www.cnblogs.com/dongdong25800/p/10671761.html
Copyright © 2020-2023  润新知