字典树-THE XOR largest pair
题目:给你n个数字A1,A2....An ,问从中选出两个数字异或运算得到的最大结果是多少 0<=Ai<231
用字典树,记录每个数字的31位2进制01串(int 为4个字节,每个字节8个二进制,int一共32位,最高位为符号位,所以不考虑)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5*33;
int trie[maxn][2];
int a[maxn];
int tot=1;
int main()
{
int n;
cin>>n;
for(int j=1; j<=n; j++) // 把n个数字的 0 1 串从高位到低位存入字典树
{
cin>>a[j];
int p=1;
for(int i=30; i>=0; i--)
{
int k=(a[j]>>i)&1;
if(trie[p][k]==0) trie[p][k]=++tot;
p=trie[p][k];
}
}
int maxx=0;
for(int i=1; i<=n; i++) // 对于每个数字 从高位到低位判断每个为0还是1,然后专门找与它不同的往下探索,如果没有不同只能取相同,因为是从高位到低位可以保证得到的t串与这个数字异或得到最大值
{
int p=1;
int t=0;
for(int j=30; j>=0; j--)
{
int k=(a[i]>>j)&1;
if(trie[p][k^1])
{
t=(t<<1)+(k^1); // 必须加括号
p=trie[p][k^1];
}
else
{
t=(t<<1)+k; // 必须加括号
p=trie[p][k];
}
}
maxx=max(maxx,t^a[i]);
}
cout<<maxx<<endl;
}
// 测试数据
//10
//181262 369842 1036879 546331 868986 496157 646816 459571 215643 448018
//1033222