在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数N。
第二行输入N个整数A1~AN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤105,
0≤Ai<231
输入样例:
3
1 2 3
输出样例:
3
直接暴力的复杂度是n²肯定是要超时的 ,知道要用字典树那么就把每个数化成二进制保存啦,因为是异或运算,相同为0不同为1 ,所以在每个节点要优先向相反位走,相反位没路了再向相同为走,为了实现最大化要从高位向低位走(wa了好几次!!!)
#include<iostream>
#include<map>
using namespace std;
const int maxn=1e5+100;
int ed[maxn*32][5],idx=1;//理论上一个数有32位 实际用不到maxn*32
void insert(int x)
{
int p=1;
for(int i=31;i>=0;i--)
{
int y=x>>i&1;//取出每一位的值(二进制)
if(!ed[p][y]) ed[p][y]=++idx;
p=ed[p][y];
}
}
int query(int x)
{
int p=1,i=31,ans=0;
while(i>=0)
{
int y=x>>i&1;
if(ed[p][1-y]) ans+=1<<i,p=ed[p][1-y];//优先考虑相反位
else p=ed[p][y];
i--;
}
return ans;
}
int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0);
// cout.tie(0);
int n,ans=0;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
cin>>x;
insert(x);
ans=max(ans,query(x));
}
cout<<ans<<endl;
return 0;
}