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;
    }
    

      

  • 相关阅读:
    20180925-5代码规范
    20180925-4 单元测试,结对
    20180925-6 四则运算试题生成
    20180925-3 效能分析
    20170925-2 功能测试
    20180925-7 规格说明书——吉林市两日游
    20180918-1 词频统计
    第二周例行报告
    iOS开发-CocoaPods使用详细说明
    svn的使用详解
  • 原文地址:https://www.cnblogs.com/kkrisen/p/3962979.html
Copyright © 2011-2022 走看看