8 条题解

  • 1
    @ 2024-11-25 21:17:52

    本蒟第二次发题解,多多包涵 AC Code:

    #include<bits/stdc++.h>
    #include<cstdlib>
    using namespace std;
    const int N=31000010;
    //son数组用于存储字典树的节点,cnt数组用于记录叶节点的个数
    int son[N][2];
    int cnt[N];
    //idx用于记录当前使用的节点编号
    int idx=0;
    /**
     *读取输入的整数,处理EOF情况
     *@return 读取的整数,如果遇到EOF则退出程序
     */
    int read(){
        int x=0,f=1;
        char ch=getchar();
        if(ch==EOF) exit(EXIT_FAILURE);
        while(ch<'0'||ch>'9'){
            if(ch=='-') f=-1;
            ch=getchar();
            if(ch==EOF) exit(EXIT_FAILURE);
        }
        while('0'<=ch&&ch<='9'){
            x=x*10+ch-'0';
            ch=getchar();
            if(ch==EOF) break;
        }
        return x*f;
    }
    /**
     *向字典树中插入一个数
     *@param x 要插入的数
     */
    void insert(int x){
        int p=0;
        for(int i=31;i>=0;i--){
            int u=(x>>i)&1;
            if(!son[p][u]) son[p][u]=++idx;
            p=son[p][u];
        }
        cnt[p]++;
    }
    /**
     *在字典树中查找与给定数最大异或的结果
     *@param x 给定的数
     *@return 与给定数最大异或的结果
     */
    int find(int x){
        int p=0,res=0;
        for(int i=31;i>=0;i--){
            int u=(x>>i)&1;
            if(son[p][!u]){
                p=son[p][!u];
                res+=1<<i;
            }
            else{
                p=son[p][u];
            }
        }
        return res;
    }
    //主函数
    int main(){
        int n=read();
        int a[N];
        for(int i=1;i<=n;i++){
            a[i]=read();
            insert(a[i]);
        }
        int res=0x80808080;
        for(int i=1;i<=n;i++){
            res=max(res,find(a[i]));
        }
        printf("%d\n",res);
        return 0;
    }
    

    原创不易,切勿抄袭

    信息

    ID
    94
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    738
    已通过
    173
    上传者