0
点赞
收藏
分享

微信扫一扫

【acwing】143. 最大异或对

墨香子儿 2022-03-16 阅读 31
c++算法

穿越隧道

#include <bits/stdc++.h>
using namespace std;
const int N = 4e6 + 10;
//1e5 * 31 约等于 4e6 (int型数字的二进制位数有31位)

int son[N][2],cnt[N];
int idx;
int a[N];
int n;
void insert(int x){
    int p = 0;
    for(int i = 30; i >= 0; i--){
        int u = x>>i&1;//二进制的第i位是0还是1
        if(!son[p][u]) son[p][u] = ++idx;
        p = son[p][u];
    }
}
int query(int x){
    int res = 0, p = 0;
    for(int i = 30; i >= 0; i--){
        int u = x>>i&1;
        if(son[p][!u]){
            p = son[p][!u];
            res = res*2+1;//若存在不同的二进制位时,res的1的长度加1
        }
        else{
            p=son[p][u];
            res = res*2;//若不存在不同的二进制位时,res的0的长度加1
        }
    }
    return res;
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i++){//建字典树,相当于已经任选了一个数
        cin >> a[i];
        insert(a[i]);  
    }
    int ans = -1;
    for(int i = 0; i < n; i++){
        ans = max(ans,query(a[i]));//进行查询,找之前任选的数(尽可能相反的数)
    }
    cout << ans << endl;
    return 0;
}
举报

相关推荐

0 条评论