题目描述:
解答:
因为这里只需要两个数字的异或对最大,所以我们可以考虑将数字拆分成2进制, 将数字的每一位都存储下来,
然后再逐个进行比对,我们可以联想到用字典树。
下面附上代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1000010;
int a[maxn];
int n;
int tree[maxn][2];
int tot = 0;
void add(int x)
{
int p = 0;
for(int i = 30;i>=0;i--)
{
int c = (x>>i)&1;
if(!tree[p][c])
{
tree[p][c] = ++tot;
}
p = tree[p][c];
}
}
int solve(int x)
{
int p = 0;
int res = 0;
for(int i = 30;i>=0;i--)
{
int c = (x>>i)&1;
if(tree[p][c^1]) //将作比较的数 按位去反,这样可以找到异或的最大值
{
p = tree[p][c^1];
res|=(1<<i);
}
else
{
p = tree[p][c];
}
}
return res;
}
int main()
{
int ans = 0;
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
scanf("%d",&a[i]);
add(a[i]);
}
for(int i = 0;i<n;i++)
{
ans = max(ans,solve(a[i]));
}
printf("%d\n",ans);
return 0;
}