相当于为每一个数 的每一位建立一个节点
由于每个数最多32为所以M开这么大
注意:异或的时候从高位选择才能选择出来最大的
每一步首先看一下树中有没有与本位相反的位(这样的话异或值为1)
有的话走过去
否则只能走向相同节点
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10,M=N*32;
int son[M][2],idx;
void insert(int a)
{
int p=0;
for(int i=30;i>=0;--i)
{
int k=(a>>i)&1;
if(!son[p][k])son[p][k]=++idx;
p=son[p][k];
}
}
int getmax(int a)
{
int p=0;
int res=0;
for(int i=30;i>=0;--i)
{
int k=(a>>i)&1;
if(son[p][!k])
{
p=son[p][!k];
res+=1<<i;
}
else p=son[p][k];
}
return res;
}
int main()
{
int n,ans=0;
cin>>n;
for(int i=0;i<n;++i)
{
int a;
cin>>a;
insert(a);
ans=max(getmax(a),ans);
}
cout<<ans;
}