在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数 N。
第二行输入 N个整数 A1~AN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤105,
0≤Ai<2^31输入样例:
3 1 2 3
输出样例:
3
难度:简单 时/空限制:1s / 64MB 总通过数:46174 总尝试数:91483 来源:《算法竞赛进阶指南》, 模板题 算法标签
挑战模式
将每个数转化为2进制然后存入字典树中
#include <iostream>
using namespace std;
constexpr int N=1e5+7,M=31*N;
int tr[M][2];
int idx;
void insert(int k){
int p=0;
for(int i=30;i>=0;i--){
int u=k>>i&1;
if(!tr[p][u]) tr[p][u]=++idx;
p=tr[p][u];
}
}
int query(int k){
int p=0,ans=0;
for(int i=30;i>=0;i--){
int u=k>>i&1;
if(tr[p][!u]) {
p=tr[p][!u];
ans=ans*2+!u;
}
else {
p=tr[p][u];
ans=ans*2+u;
}
}
return ans;
}
int main() {
int n, k;
scanf("%d", &n);
int res = -1;
for (int i = 1; i <= n; i++) {
scanf("%d", &k);
insert(k);
int t = query(k);
res = max(res, k ^ t);
}
printf("%d\n",res);
return 0;
}