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
异或为不进位加法,尽量走不相同的
#include<bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } #define pi 3.14159265358979323846 const int INF=0x3f3f3f3f; const int mod=1e9+7; const int maxn=5e6+100; const int maxa=1e9+10; const int N=1e5+100; int son[maxn][2],idx,a[maxn],n; void insert(int x){ int p=0; for(int i=30;i>=0;i--){ int u=x>>i&1; if(!son[p][u]){ son[p][u]=++idx; } p=son[p][u]; } } int serch(int x){ int p=0;int ans=0; for(int i=30;i>=0;i--){ int u=x>>i&1; if(son[p][!u]){//每次尽量走和他不同的 p=son[p][!u]; ans+=1<<i;//可以贡献,因为为相异的 }else{ p=son[p][u]; } } return ans; } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; insert(a[i]); } int ans=0; for(int i=1;i<=n;i++){ ans=max(ans,serch(a[i]));///search(a[i])查找的是a[i]值的最大与或值 } printf("%d",ans); }