题目链接:https://www.acwing.com/problem/content/description/145/
在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数N。
第二行输入N个整数A1~AN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤10^5,
0≤Ai<2^31
输入样例:
3
1 2 3
输出样例:
3
题解:将每个整数分为32位二进制的数,先插入字典树,然后,检索时,每个数从最高位开始,按二进制位的相反位开始检索,若相反位走不通,则按相同位检索,直到无路可走,此时最大数即为所走的路的二进制表示。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e7+5;
int trie[N][2],tot = 1, a[100005];
void insert(int s) {
int p = 0;
for(int i=31;i>=0;i--) {
int ch = 0;
if((s>>i)&1) {
//cout << i << endl;
ch = 1;
}
if(!trie[p][ch]) {
trie[p][ch] = tot++;
}
p = trie[p][ch];
}
}
ll query(int x) {
ll p = 0,ans = 0;
for(int i=31;i>=0;i--) {
int ch = 1;
if((x>>i)&1) {
ch = 0;
}
if(trie[p][ch]) {
p = trie[p][ch];
ans += pow(2,i);
}else {
p = trie[p][ch^1];
}
if(!p)break;
}
return ans;
}
int main() {
int n;
cin >> n;
for(int i=0;i<n;i++) {
cin >> a[i];
insert(a[i]);
}
ll ans = -1;
for(int i=0;i<n;i++) {
ans = max(ans,query(a[i]));
}
cout << ans;
return 0;
}