题目来自洛谷网站:

思路:
两个循环时间复杂度太高了,会超时。
我们可以先将读入的数字,插入到字典树中,从高位到低位。对每个数查询的时候,题目要求是最大的异或对,所以我们选择相反的路径,构造最大异或值。
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int arr[N];
int ch[N*31][2], idx;//idx给树上每个节点一个编号
void trie(int x){
int p = 0;//p是当前走到了哪个节点编号
for(int i = 30; i >= 0; i--){
//取出最后一个数字
//判断0 1
int j = x>>i&1;
if(!ch[p][j]) ch[p][j] = ++idx;
p = ch[p][j];
}
}
int query(int x){
int p = 0, res = 0;
for(int i = 30; i >= 0; i--){
int j = x>>i&1;
//相反的一边
if(ch[p][!j]){
res += 1<<i;
p = ch[p][!j];
}
else p = ch[p][j];
}
return res;
}
int main(){
cin >> n;
for(int i = 1; i<=n; i++){
cin >> arr[i];
trie(arr[i]);
}
int ans = -1;
for(int i = 1; i<=n; i++){
ans = max(ans, query(arr[i]));
}
cout << ans << endl;
return 0;
}