#LOJ 10050 The XOR Largest Pair

#10050. 「一本通 2.3 例 2」The XOR Largest Pair

又是搋树。

看到这一题,首先想到的 \(\mathcal{O(n^2)}\) 的暴力,一看范围 \(1e5\) 果断放弃。

想想正解怎么做(我也借鉴了别人的思路,毕竟第一次学

根据 \(\oplus\) 的性质,相同为 \(1\),不同为 \(0\),也就是说,把数拆成二进制,越高位不一样 \(\oplus\) 出来的数越大,利用搋树,此时搋树是个二叉树,我们以二进制最高位为根建立搋树,因为这样能把路径上的值按照二进制转十进制的方法求出来,因为高位不一样越大,和线段树进左右子树一样。

/*
Knowledge : Rubbish Algorithm
Work by :Gym_nastics
Time : O(AC)
*/
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int INF=0x3f3f3f3f;
const int Mod=1e9+7;
const int N=1e6+6;

int read() {
    int x=0,f=0;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) f|=(ch=='-');
    for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch&15);
    return f?-x:x;
}

void print(int x) {
    if(x<0) putchar('-'),x=-x;
    if(x>9) print(x/10);
    putchar(x%10+48);
}

int Trie[N][2],tot;

void Insert(int x){
    int pos=0;
    for(int i=31;i>=0;i--){
        int w=(x>>i)&1;
        if(!Trie[pos][w]) Trie[pos][w]=++tot;
        pos=Trie[pos][w];
    }
}

int Query(int x){
    int res=0,pos=0;
    for(int i=31;i>=0;i--){
        int w=(((x>>i)&1)^1);
        if(Trie[pos][w]) res=res<<1|1,pos=Trie[pos][w];
        else res<<=1,pos=Trie[pos][w^1];
    }return res;
}

signed main() {
   int n=read(),Ans=-INF;
   for(int i=1;i<=n;i++){
       int x=read();Insert(x);               
       Ans=max(Ans,Query(x));
   }print(Ans);
   return 0;
}


posted @ 2022-03-13 17:26  Gym_nastics  阅读(33)  评论(0编辑  收藏  举报