#include<bits/stdc++.h>
using namespace std;
#define N 100005
int n,m,i,j,ans,a[N],dp[N*30],c[35],Pow[35],Max,num;
struct ren{int ch[2];}d[N*30];
void f(int x){
for(int i=30;i>=0;i--) if(x>=Pow[i]) x-=Pow[i],c[i]=1,Max=max(Max,i);
for(int i=0,j=30;i<=j;i++,j--) swap(c[i],c[j]);
}
void upd(){
int p=0;
for(int i=30-Max;i<=30;i++){
if(!d[p].ch[c[i]]) d[p].ch[c[i]]=++num;
p=d[p].ch[c[i]];
}
}
void dfs(int k,int b){
int cnt=0;
if(d[k].ch[0]) cnt++,dfs(d[k].ch[0],b-1),dp[k]=min(dp[k],dp[d[k].ch[0]]);
if(d[k].ch[1]) cnt++,dfs(d[k].ch[1],b-1),dp[k]=min(dp[k],dp[d[k].ch[1]]);
if(cnt==0) dp[k]=0;
if(cnt==2) dp[k]+=Pow[b];
}
int main(){
Pow[0]=1;for(i=1;i<=31;i++) Pow[i]=Pow[i-1]<<1;
scanf("%d",&n);
memset(dp,1,sizeof(dp));
for(i=1;i<=n;i++) scanf("%d",&a[i]);
for(i=1;i<=n;i++){
for(j=0;j<=30;j++) c[j]=0;
f(a[i]);
}
for(i=1;i<=n;i++){
for(j=0;j<=30;j++) c[j]=0;
f(a[i]),upd();
}
dfs(0,Max);
printf("%d\n",dp[0]);
return 0;
}
思路是把每个数转二进制丢进 Trie 里,然后跑树形 dp,但是 WA on #6