描述
在给定的N个整数A1,A2……AN中选出两个进行xor运算,得到的结果最大是多少?
输入格式
第一行一个整数N,第二行N个整数A1~AN。
输出格式
一个整数表示答案。
样例输入
3
1 2 3
样例输出
3
数据范围与约定
- 对于100%的数据: N<=10^5, 0<=Ai<2^31。
字典树
把数值转化成二进制,然后尽量选和当前相反的值,这样取得的异或值最大
#include <iostream>
using namespace std;
static const auto io_sync_off = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
const int maxn = 100005;
int tot = 1, trie[maxn * 31][2];
int insert(int num)
{
int p = 1;
for (int i = 30; ~i; --i)
{
int ch = num >> i & 1;
if (!trie[p][ch])
trie[p][ch] = ++tot;
p = trie[p][ch];
}
}
int check(int num)
{
int p = 1, temp = 0;
for (int i = 30; ~i; --i)
{
int ch = num >> i & 1;
if (trie[p][!ch])//选相反的
{
temp += 1 << i;//加到答案
p = trie[p][!ch];
}
else
p = trie[p][ch];
}
return temp;
}
int main()
{
int n, nums, ans = 0;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> nums;
ans = max(ans, check(nums));
insert(nums);
}
cout << ans;
return 0;
}