题意:
给你n个整数,让你选择两个数进行Xor操作后值最大为多少?

思路:
建一颗01trie树,从高位到低位,然后从遍历数组,利用01trie树求每一个数与其中某一个一个数Xor的最大值,然后取总的最大值。
取法:
如果该数在该位上是1则尽可能在01trie树该位取0使其Xor为1。
如果该数在该位上是0则尽可能在01trie树该位取1使其Xor为1。

注意:从高位到低位建树。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int a[33], cnt[3200005][2], ji=1, pa[1000005];
ll ma=-1;

void Insert()
{
    int now=0, i=31;
    while(i>=0)
    {
        if(cnt[now][a[i]]==-1)
        {
            cnt[now][a[i]]=ji;
            ji++;
        }
        now=cnt[now][a[i]];
        i--;
    }
}

void fun()
{
    ll now=0, p=0, k=(1LL<<31), i=31;
    while(i>=0)
    {
        if(a[i]==1&&cnt[now][0]!=-1)
        {
            p=p+k;
            now=cnt[now][0];
        }
        else if(a[i]==0&&cnt[now][1]!=-1)
        {
            p=p+k;
            now=cnt[now][1];
        }
        else if(a[i]==1&&cnt[now][1]!=-1)
        {
            now=cnt[now][1];
        }
        else
        {
            now=cnt[now][0];
        }
        i--;
        k=k/2;
    }
    ma=max(p,ma);
}

int main()
{
    int n;
    scanf("%d",&n);
    memset(cnt,-1,sizeof(cnt));
    for(int i=0;i<n;i++)
    {
        scanf("%d",&pa[i]);
        int x=pa[i];
        for(int j=0;j<32;j++)
        {
            a[j]=x%2;
            x=x/2;
        }
        Insert();//建01trie树
    }
    for(int i=0;i<n;i++)
    {
        int x=pa[i];
        for(int j=0;j<32;j++)
        {
            a[j]=x%2;
            x=x/2;
        }
        fun();
    }
    cout << ma << endl;
    return 0;
}