欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

CSU 1216 异或最大值

程序员文章站 2022-07-14 14:39:10
...

求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\n",ans);
    }
    return 0;
}