在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少?
输入格式
第一行输入一个整数N。
第二行输入N个整数A1A1~ANAN。
输出格式
输出一个整数表示答案。
数据范围
1≤N≤1051≤N≤105,
0≤Ai<2310≤Ai<231
输入样例:
3
1 2 3
输出样例:
3
思路:异或为不进位加法。
找出两个个数字的异或最大值,那么每个数字可以用二进制表示。用tire树存放个数字的二进制。
#include <iostream> using namespace std; const int maxn= 1e5+10; const int maxm=maxn*31; int a[maxn]; int tree[maxm][2],idx; void tireinsert(int x) { int root=0; for(int i=30;i>=0;i--) { int u= x >> i & 1; if(!tree[root][u]) tree[root][u] = ++idx; root=tree[root][u]; } } int tirefind(int x) { int root=0,res=0; for(int i=30;i>=0;i--) { int u=x >> i & 1; if(tree[root][!u]) { root=tree[root][!u]; res=res*2+!u; } else { root=tree[root][u]; res=res*2+u; } } return res; } int main() { int n; cin >> n; for(int i=0;i<n;i++) scanf("%d",&a[i]); int ans=0; for(int i=0;i<n;i++) { tireinsert(a[i]); int num=tirefind(a[i]);//要异或的那个数字 ans=max(ans,num^a[i]); } cout << ans ; return 0; }