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

  

原文地址:https://www.cnblogs.com/kkrisen/p/3962979.html