The XOR Largest Pair
时间限制: 1 Sec 内存限制: 128 MB
题目描述
在给定的N个整数A1,A2……AN中选出两个进行xor运算,得到的结果最大是多少?
输入
第一行一个整数N,第二行N个整数A1~AN。
输出
一个整数表示答案。
样例输入
复制样例数据
3 1 2 3
样例输出
3
提示
对于100%的数据: N<=10^5, 0<=Ai<2^31。
二进制转换建字典树,然后查一下就行了,当查到1的时候看有没有0,有的话异或肯定数会变大,并且深度设为31,不足31位的在前面补0。。
/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>
typedef long long LL;
using namespace std;
int c[3100005][3];//注意这边是深度位31,但是有10000个数,所以开3100005
int n, a[100005], tot;
void insert(int x){
int p = 0;
for (int i = 30; i >= 0; i--){
int t = (x >> i) & 1;
if(!c[p][t]) c[p][t] = ++tot;
p = c[p][t];
}
}
int solve(int x){
int p = 0, ans = 0;
for (int i = 30; i >= 0; i--){
int t = (x >> i) & 1;
if(c[p][t ^ 1]) p = c[p][t ^ 1], ans = (ans << 1) | 1;
else p = c[p][t], ans <<= 1;
}
return ans;
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++){
scanf("%d", &a[i]);
insert(a[i]);
}
int ans = 0;
for (int i = 1; i <= n; i++){
ans = max(ans, solve(a[i]));
}
printf("%d\n", ans);
return 0;
}
/**/