由题意可以知道
我们需要把 每个ai分成 二进制的形式来解体
当二进制 的这一位 若每一个ai都为1的话 那么直接改为0即可
若有 1 也有 0 的话 那就要选择了 是选择去 1的那边 还是 0的那边
这个时候就需要用递归来做了
复杂度就为 (log(max(a[i]) * n);
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
const int N = 1e5 + 10;
typedef long long ll;
ll a[N];
vector<ll>v[N * 30];
ll ans = 1e18;
int cnt = 1;
int n;
void dfs(int x,int d){
bool flag = true;
for(auto j : v[d]){
if(j != v[d][0]){
flag = false;
break;
}
}
if(flag){
for(int i = x; i >= 0; i--){
if((v[d][0] >> i) & 1){
v[d][0] ^= (1 << i);
}
}
ans = min(ans,v[d][0]);
return;
}
int s = 0,h = 0;
for(auto j : v[d]){
if((j >> x) & 1){
if(!s) s = ++cnt;
v[s].push_back(j);
}else{
if(!h) h = ++cnt;
v[h].push_back(j ^ (1 << x));
}
}
if(v[h].size() == v[d].size()){
v[h].clear();
for(auto j : v[d]){
v[h].push_back(j);
}
}
if(v[s].size() == v[d].size()){
v[s].clear();
for(auto j : v[d]){
v[s].push_back(j ^ (1 << x));
}
}
if(s) dfs(x - 1,s);
if(h) dfs(x - 1,h);
}
int main(){
cin >> n;
int start = 0;
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
v[1].push_back(a[i]);
int s = 0;
while(a[i] > 0){
s++;
a[i] >>= 1;
}
start = max(start,s - 1);
}
dfs(start,1);
cout << ans << endl;
return 0;
}