题解: https://xiaoxiaoh.blog.csdn.net/article/details/104634940
一、内容
在给定的N个整数A1,A2……AN
中选出两个进行xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数N。第二行输入N个整数A1~AN
输出格式
输出一个整数表示答案。
数据范围
1≤N≤105,0≤ Ai < 231
输入样例:
3
1 2 3
输出样例:
3
二、思路
三、代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5;
int n, mx, son[N * 32][2], p[N], len;
bool v[N * 32];
void add(int x) {
int p = 0;
for (int i = 30; i >= 0; i--) {
int u = (x >> i) & 1;
if (!son[p][u]) son[p][u] = ++len;
p = son[p][u];
}
v[p] = true;
}
void query(int x) {
int p = 0, ans = 0;
for (int i = 30; i >= 0; i--) {
int u = (x >> i) & 1;
int v = u ^ 1; //取相反的
if (!son[p][v]) v ^= 1; //那么就取正的
ans += (u << i) ^ (v << i);
p = son[p][v];
}
mx = max(mx, ans);
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &p[i]);
add(p[i]);
}
for (int i = 1; i <= n; i++) query(p[i]);
printf("%d\n", mx);
return 0;
}