惨遭MLE
#include <bits/stdc++.h>
#define P pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
using namespace std;
const int N=2e5+5,K=32;
int n;
int a[N];
int f[N];
int idx[N],en[N][K<<3];
int fl=1;
int ans;
struct node{
int ch[2],siz,fa;
}tr[N][K<<3];
vector<int>son[N];
void add(int id,int num,int nid)
{
int p=0;
for(int i=4;i>=0;i--)
{
bool x=num&(1<<i);
if(!tr[id][p].ch[x])
tr[id][p].ch[x]=++idx[id],tr[id][idx[id]].fa=p;
p=tr[id][p].ch[x];
}
en[id][p]=nid;
tr[id][p].siz=1;
p=tr[id][p].fa;
while(p!=-1)
{
tr[id][p].siz=1+tr[id][tr[id][p].ch[0]].siz+tr[id][tr[id][p].ch[1]].siz;
p=tr[id][p].fa;
}
tr[id][0].siz=0;
}
int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int to[N],len[N];
P query(int id,int num)
{
int mrt=0,nrt=0;
int res=0;
for(int i=4;i>=0;i--)
{
bool x=num&(1<<i);
if(tr[0][tr[0][mrt].ch[x]].siz-tr[id][tr[id][nrt].ch[x]].siz>0)
mrt=tr[0][mrt].ch[x],nrt=tr[id][nrt].ch[x];
else
{
mrt=tr[0][mrt].ch[x^1];
if(!tr[id][nrt].ch[x^1])
tr[id][nrt].ch[x^1]=++idx[id],tr[id][idx[id]].fa=nrt;
nrt=tr[id][nrt].ch[x^1];
res+=(1<<i);
}
}
return mp(en[0][mrt],res);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<=n;i++)
tr[i][0].fa=-1,tr[i][0].siz=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
add(0,a[i],i);
}
for(int i=1;i<=n;i++)
add(i,a[i],0),f[i]=i,son[i].pb(i);
while(fl)
{
fl=0;
memset(to,-1,sizeof to);
memset(len,0x3f,sizeof len);
for(int i=1;i<=n;i++)
{
P ret=query(find(i),a[i]);
if(len[find(i)]>ret.se)
to[find(i)]=ret.fi,len[find(i)]=ret.se;
}
for(int i=1;i<=n;i++)
{
int fx=find(i);
if(to[fx]!=0 && to[fx]!=-1 && fx!=find(to[fx]))
{
ans+=len[fx];
for(auto val:son[find(to[fx])])
{
son[fx].pb(val);
add(fx,val,0);
}
f[find(to[fx])]=fx;
tr[fx][0].siz=0;
tr[find(to[fx])][0].siz=0;
fl=1;
}
}
}
printf("%d",ans);
return 0;
}