• 最大异或对(字典树)


    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);
    }
     
  • 相关阅读:
    第二题
    第一题
    biancheng
    用泰勒展开式计算sin
    矩阵求和
    1
    ti
    实验10
    实验9
    实验8
  • 原文地址:https://www.cnblogs.com/lipu123/p/13022463.html
Copyright © 2020-2023  润新知