在给定的 N个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数 N。
第二行输入 N 个整数 A1~AN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤10^5,
0≤Ai<2^31
思路:
容易想到二维暴力循环写法,发现第二维可以用Tire优化。
将每个数转化为31二进制数,建立Tire树。
如图所示:
由异或的性质可知。从最高位开始,如果存在相异的分支,则相异的分支一定为最优,否则走另一条分支。
Code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=100010,M=3100010;
int son[M][2],idx;
int a[N];
void insert(int x)
{
int p=0;
for(int i=30;~i;i--)
{
int &s=son[p][x>>i&1];
if(!s) s=++idx;
p=s;
}
}
int query(int x)
{
int p=0,res=0;
for(int i=30;~i;i--)
{
int s=x>>i&1;
if(son[p][!s])
{
res+=1<<i;
p=son[p][!s];
}
else
p=son[p][s];
}
return res;
}
signed main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
insert(a[i]);
}
int res=0;
for(int i=1;i<=n;i++) res=max(res,query(a[i]));
cout<<res;
}