最大异或对

The XOR Largest Pair

https://ac.nowcoder.com/acm/contest/1010/B

根据每个数的二进制当成字符串,建字典树,每次查询是,转成二进制的每一位,根据异或的性质,要尽可能的与当前的为不同,异或后为 1 ;

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=31*N;

int son[M][2],a[N],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 find(int x){
    int p=0;
    int res=0;
    for(int i=30;i>=0;i--){
        int u=(x>>i)&1;//每次都走跟他相反的
        if(son[p][!u]){
            res=res*2+1;
            p=son[p][!u];
        }
        else{
            res=res*2+0;
            p=son[p][u];
        }
    }
    return res;
}

int main(){
    ios::sync_with_stdio(false);
    int n;
    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++){
        // cout<<find(a[i])<<" ";
        // cout<<endl;
       ans=max(ans,find(a[i])); 
    }
    cout<<ans<<endl;
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务