AcWing 143. 最大异或对
原题链接
简单
作者:
帅
,
2020-09-12 10:44:03
,
所有人可见
,
阅读 375
C++ 代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
int n;
int a[maxn];
int son[maxn*32][2], cnt[maxn*32], idx;
void insert(int x)
{
int p = 0;
for(int i = 30; i >= 0; i --)
{
int u = x >> i & 1;
if(!son[p][u]) son[p][u] = ++idx; // p为根是0 ,所有的其他从1开始放, 0不放东西
p = son[p][u];
}
}
int query(int x)
{
int p = 0, ans = 0;
for(int i = 30; i >= 0; i --)
{
int num = x >> i & 1;
if(son[p][!num])
{
ans += (1 << i);
p = son[p][!num];
}
else p = son[p][num];
}
return ans;
}
int main()
{
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
{
scanf("%d",&a[i]);
insert(a[i]);
}
int maxi = -1;
for(int i = 1; i <= n; i ++)
{
maxi = max(maxi, query(a[i]));
}
printf("%d\n",maxi);
}