字典树-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

 

posted @ 2019-04-08 17:10  paranoid。  阅读(165)  评论(0编辑  收藏  举报