最大异或对(字典树)

143. 最大异或对 

https://www.acwing.com/problem/content/description/145/

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

输入格式

第一行输入一个整数N。

第二行输入N个整数A1AN

输出格式

输出一个整数表示答案。

数据范围

1N10^5,
0Ai<2^31

输入样例:

3
1 2 3

输出样例:

3
异或为不进位加法,尽量走不相同的
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll; 
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
#define pi 3.14159265358979323846
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
const int maxn=5e6+100;
const int maxa=1e9+10;
const int N=1e5+100;
int son[maxn][2],idx,a[maxn],n;
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 serch(int x){
    int p=0;int ans=0;
    for(int i=30;i>=0;i--){
        int u=x>>i&1;
        if(son[p][!u]){//每次尽量走和他不同的
            p=son[p][!u];
            ans+=1<<i;//可以贡献,因为为相异的 
        }else{
            p=son[p][u];
        }
    }
    return ans; 
}
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,serch(a[i]));///search(a[i])查找的是a[i]值的最大与或值
    }
    printf("%d",ans);
}
 
原文地址:https://www.cnblogs.com/lipu123/p/13022463.html