老套路了,可我DFS挂了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3+5;
const int maxnode= 3300005;
int n;
int a[maxn];
int mp[maxn][32];
int bit[maxn],b[maxn];
//Trie
int trie[maxnode][32],val[maxnode];
int rt,tot;
void insert(int res){
int pos=rt;
for(int i=1;i<=n;i++){
int id = bit[i];
if(trie[pos][id]==0) trie[pos][id]=++tot;
pos=trie[pos][id];
}
val[pos]=res;
}
int find(int x){
int pos=rt;
for(int i=1;i<=n;i++){
int id = x-bit[i];
if(id<0) return -1;
if(trie[pos][id]==0) return -1;
pos=trie[pos][id];
}
return val[pos];
}
//
//void dfs1(int p,int type,int res,int bit[]){
// if(p==16){
// insert(res);
// show(res);
//
// return ;
// }
// for(int i=1;i<=n;i++){
// bit[i] += mp[i][p]^type;
// }
// dfs1(p+1,0,res<<1,bit);
// dfs1(p+1,1,res*2+1,bit);
//}
//int ans;
//void getans(int n1,int n2){
// ans=0;
// while(n2){
// ans<<=1;
// ans+=(n2&1);
// n2>>=1;
// }
// while(n1){
// ans<<=1;
// ans+=(n1&1);
// n1>>=1;
// }
//}
//void dfs2(int p,int type,int res,int bit[]){
// if(ans!=-1) return ;
// for(int i=1;i<=n;i++){
// bit[i] += mp[i][p]^type;
// }
// if(p==30){
// for(int i=0;i<=30;i++){
// int f=find(i);
// if(f!=-1){
// printf("ans i=%d %d %d\n",i,f,res);
// //cout<<"ans"<<i<<endl;
// getans(f,res);
// break;
// }
// }
// return ;
// }
// dfs2(p+1,0,res<<1,bit);
// dfs2(p+1,1,res*2+1,bit);
//}
void work(){
int lmt=1<<15;
for(int i=1;i<=n;i++) b[i]=a[i]>>15;
for(int x=0;x<=lmt;x++){
for(int i=1;i<=n;i++) bit[i]=__builtin_popcount(b[i]^x);
insert(x);
}
for(int i=1;i<=n;i++) b[i]=a[i]%lmt;
for(int x=0;x<=lmt;x++){
for(int c=0;c<30;c++){
for(int i=1;i<=n;i++) bit[i]=bit[i]=__builtin_popcount(b[i]^x);
int f=find(c);
if(f!=-1) {
cout<<f*(1<<15)+x<<endl;
exit(0);
}
}
}
}
int main(){
//freopen("in.txt","r",stdin);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
work();
cout<<-1<<endl;
return 0;
}