Acwing143. 最大异或对

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

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

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

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

数据范围
1≤N≤105,
0≤Ai<231

样例输入
3
1 2 3
输出
3
思想:把每个数以二进制插入在字典树中,从头到尾异或,求出最大值

#include 
#include 
#include 
#include 
using namespace std;

typedef unsigned long long ull;
const int N = 10000010,P=131;
int n, m,len=1;
int trie[N][2], tot = 1,ed[N],ch[32],res=0;

void insert(int str)
{
    memset(ch,0,sizeof(ch));
    int k=0;
    while(str)
    {
        if(str&1)
            ch[k]=1;
        str>>=1;
        k++;
    }
    int p=1;
    for(int i=30;i>=0;i--)
    {
        if (trie[p][ch[i]] == 0) trie[p][ch[i]] = ++tot;
        p = trie[p][ch[i]];
    }
}
void check(int str)
{
     memset(ch, 0, sizeof ch);
    int k = 0;
    while (str)
    {
        if (str& 1) ch[k] = 1;
      str>>= 1;
        k++;
    }
    int p = 1, sum = 0;
    for (int i = 30; i >= 0; i--)
    {
        sum <<= 1;
        if (trie[p][ch[i] ^ 1]){
            sum++;
            p = trie[p][ch[i] ^ 1];
        }
        else{
            p = trie[p][ch[i]];
        }
        //cout<<(ch[i] ^ 1)<
    }
   // cout<
    res = max(res, sum);
}
int main()
{
    int i,j,v=1;
    cin>>n;
    for(i=0;i<n;i++)
    {
        int t;
        cin>>t;
        insert(t);
        check(t);
    }
    cout<<res;
    return 0;
}

你可能感兴趣的:(c++,算法)