AcWing 143. 最大异或对

//先转换成二进制,然后从从高位开始异或

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, M = 3000000;
int n;
int a[N], son[M][2], idx;
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]=++idx;//如果不存在,就创建
        p=son[p][u];
    }
}
int query(int x) {
    int p=0,res=0;
    for(int i=30; i>=0; i--) {
        int u=x>>i&1;//取出最高位   当前位
        if(son[p][!u]) {  //如果另外一个方向存在
            p=son[p][!u];
            res=res*2+!u;//相当于把所有数字往左移动一位
        } else {
            p=son[p][u];
            res=res*2+u;
        }
    }
    return res;
}
int main() {
    cin>>n;
    for(int i=0; i<n; i++) cin>>a[i];
    int res=0;
    for(int i=0; i<n; i++) {
        insert(a[i]);//先插入    为了不处理空集的情况
        int t=query(a[i]);//再查询
        res=max(res,a[i]^t);
    }
    cout<<res<<endl;
}

 

 

AcWing 143. 最大异或对

上一篇:支付回调和查单实现指引


下一篇:AcWing 240. 食物链