题目来自洛谷网站:

思路:
两个循环时间复杂度太高了,会超时。
我们可以先将读入的数字,插入到字典树中,从高位到低位。对每个数查询的时候,题目要求是最大的异或对,所以我们选择相反的路径,构造最大异或值。
代码:
#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 1int 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;
}