题目
在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数N。
第二行输入N个整数A1~AN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤105,
0≤Ai<231
输入样例:
3
1 2 3
输出样例:
3
题解
- 将每个数字 a i a_i ai的二进制数插入到 t r i e trie trie中
- 比较式将每个数 a j ( 1 ≤ j < i ) a_j(1 \leq j < i) aj(1≤j<i)的二进制数在 t r i e trie trie与 a i a_i ai的二进制数比较,尽量走每一位数字不同的(贪心),每次比较取 max \max max即可
code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 100;
template <typename T>
inline void read(T &s) {
s = 0;
T w = 1, ch = getchar();
while (!isdigit(ch)) { if (ch == '-') w = -1; ch = getchar(); }
while (isdigit(ch)) { s = (s << 1) + (s << 3) + (ch ^ 48); ch = getchar(); }
s *= w;
}
int n, ans, tot;
int a[maxn];
int t[32 * maxn][5];
inline void insert(int x) {
int p = 0;
for (int i = 31; i >= 0; --i) {
int ch = (x >> i) & 1;
if (!t[p][ch]) t[p][ch] = ++tot;
p = t[p][ch];
}
}
inline int search(int x) {
int p = 1, cnt = 0;
for (int i = 31; i >= 0; --i) {
int ch = (x >> i) & 1;
if (t[p][ch ^ 1]) {
p = t[p][ch ^ 1];
cnt |= (1 << i);
}
else p = t[p][ch];
}
return cnt;
}
int main() {
read(n);
for (int i = 1; i <= n; ++i) {
read(a[i]);
insert(a[i]);
ans = max(ans, search(a[i]));
}
printf("%d\n", ans);
return 0;
}