基础算法 143.最大异或对
此题目使用Trie树,代码中的N代表着节点可能的最大个数。
#include<iostream> using namespace std; const int N = 3100010; int son[N][2], num[100010], idx; void insert(int k){ scanf("%d", &num[k]); int i = 30; int p = 0; while(i+1){ int u = (num[k] >> i) & 1; if(!son[p][u])son[p][u] = ++ idx; p = son[p][u]; i --; } } int find(int n){ int i = 30, p = 0, res = 0; while(i+1){ int u = (n >> i) & 1; if(son[p][!u]){ res += 1 << i; p = son[p][!u]; } else p = son[p][u]; i --; } return res; } int main(){ int n; scanf("%d",&n); for(int i = 0; i < n; i ++){ insert(i); } int res = 0; for(int i = 0; i < n; i ++){ res = max(res, find(num[i])); } cout << res; return 0; }