106 最大异或对


视频链接:

 

#include 
using namespace std;

const int N = 100010;
int n;
int a[N];
// ch[p][e]: p父节点, e边, ch子节点
int ch[N*31][2], idx;

void insert(int x){ // 建树
    int p = 0;
    for(int i = 30; i >= 0; i --){
        int e = x>>i&1; //取出第i位
        if(!ch[p][e])ch[p][e] = ++idx;
        p = ch[p][e];
    }
}
int query(int x){ // 求异或值
    int p = 0, res = 0;
    for(int i = 30; i >= 0; i --){
        int e = x>>i&1;
        if(ch[p][!e]){
            res += 1<//累加位权值
            p = ch[p][!e];
        }
        else p = ch[p][e];
    }
    return res;
}
int main(){
    cin >> n;
    for(int i = 1; i <= n; i ++)
        cin >> a[i], insert(a[i]);
    int ans = 0;
    for(int i = 1; i <= n; i ++)
       ans=max(ans,query(a[i]));
    cout << ans;
    return 0;
}

相关