zoukankan      html  css  js  c++  java
  • CSU 1216 异或最大值

    求n个数里面,求两两异或的最大值

    直接来肯定会超时

    既然要异或最大值,那么两个数的二进制肯定是正好错开为好、、、为了能快速找到错开的数,确实有点难想到,用字典树,按二进制数插入,再一个一个在字典树里面找离他最远的即可。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int n;
    int A[100010];
    int ch[20*100010][2],cnt;
    int val[20*100010];
    void inserts(int x)
    {
        int rt=0;
        for (int i=30;i>=0;i--){
            bool k=((1<<i)&x);
            if (ch[rt][k]==-1){
                ch[rt][k]=cnt++;
            }
            rt=ch[rt][k];
        }
        val[rt]=x;
    }
    int query(int x)
    {
        int rt=0;
        for (int i=30;i>=0;i--){
            bool k=((1<<i)&x);
            if (ch[rt][!k]!=-1){
                rt=ch[rt][!k];
            }
            else rt=ch[rt][k];
        }
        //cout<<val[rt]<<endl;
        return x^val[rt];
    }
    int main()
    {
        //int test=(1<<2)&3;
        //cout<<test<<endl;
        while (scanf("%d",&n)!=EOF)
        {
            cnt=1;
            memset(ch,-1,sizeof ch);
            for (int i=0;i<n;i++){
                  scanf("%d",&A[i]);
                  inserts(A[i]);
            }
            int ans=0;
            for (int i=0;i<n;i++){
                int res=query(A[i]);
                ans=max(ans,res);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    

      

  • 相关阅读:
    Java运算符
    Java数据类型,常量与变量
    内存
    cmd编码
    DELL G7重置电脑操作步骤
    关于es6中...运算符的总结
    js数组与字符串相互转换
    JS中的continue,break,return的区别
    git提交步骤
    数据修改后点击确定没有保存 还是原来的数据
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3962979.html
Copyright © 2011-2022 走看看