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