Tirl——最大异或对

最大异或对

在给定的N个整数 A 1 , A 2 … … A N A_1,A_2……A_N A1A2AN中选出两个进行xor(异或)运算,得到的结果最大是多少?

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

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

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

数据范围
1≤N≤105,
0≤Ai<231
输入样例:
3
1 2 3
输出样例:
3

题解:

从高位枚举,找和我们当前位不一样的,否则只有找一样的。

#include 
using namespace std;
int n;
const int N=1e5+7;
int cnt,con[N],son[N*31][2];
void insert(int x)
{
    int p=0;
    for(int i=30;i>=0;i--){
        int u=x>>i&1;
        if(!son[p][u]) son[p][u]=++cnt;
        p=son[p][u];
    }
}
int query(int x)
{
    int ans=0;
    int p=0;
    for(int i=30;i>=0;i--){
        int u=x>>i&1;
        int tu=!u;
        if(son[p][tu]){
            p=son[p][tu];
            ans|=+tu<<i;
        }else if(son[p][u]){
            p=son[p][u];
            ans|=u<<i;
        }
    }
    return ans;
}
int main(){
    cin>>n;
    int res=0;
    for(int i=1;i<=n;i++){
        int a; scanf("%d",&a);
        insert(a);
        int t=query(a);
        res=max(res,a^t);
    }
    cout<<res<<endl;
}

你可能感兴趣的:(数据结构)