The XOR Largest Pair

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

【题目描述】

在给定的 N 个整数 A1,A2,…,AN 中选出两个进行异或运算,得到的结果最大是多少?

【算法】

trie树经典题目。以每个数字的二进制数串逆向由第31位向第0位建立trie树。用两个指针,一个插入指针插入每一位,一个查询指针贪心的取和当前插入数串的位相反的,若无相反的则只能沿相同的走(保证尽可能高的位尽可能大),注意为保证无论如何能走先插入再查询。(注意:$rec[]$ 数组要置0,查了半天- -)

【代码】

#include <bits/stdc++.h>
using namespace std;
int x,n,tot=1,ans;
int trie[4000100][2],rec[32];
inline int read() {
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }
    while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); }
    return x*f;
}
void parse(int x) {
    memset(rec,0,sizeof(rec));
    for(int i=0;x;x>>=1,i++) rec[i]=x&1;
}
void add(int x) {
    int now=0,p=1,pp=1;
    parse(x);
    for(int i=31;i>=0;i--) {
        if(trie[p][rec[i]]==0) trie[p][rec[i]]=++tot;
        p=trie[p][rec[i]];
        if(trie[pp][!rec[i]]) now<<=1,now++,pp=trie[pp][!rec[i]];
        else pp=trie[pp][rec[i]],now<<=1;
    }
    ans=max(ans,now);
}
int main() {
    n=read();
    for(int i=1;i<=n;i++) {
        x=read();
        add(x);
    }
    printf("%d\n",ans);
    return 0;
}

posted @ 2018-09-10 22:42  飞飞翔滴少年  阅读(374)  评论(0编辑  收藏  举报