前置知识点
// son[M][2] 要么是0 要么是1
// 二进制表示 0^1=1 相同为0 不同为1
// 每一位要么是0 要么是1
// 先查找后插入
// 1和2 与 2和1 是一种方案
#include <iostream>
#include <algorithm>
#
using namespace std;
const int N = 100010, M = 3100010;//N 代表个数 每个数最多31位 M代表节点个数
int n;
int a[N], son[M][2], idx;
void insert(int x)
{
int p = 0;//根节点
for (int i = 30; i >= 0; i -- )
{
int u= x >> i & 1;//这一步骤是将x右移i位到个位 然后与1与运算 得到二进制表示
if (!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];//向下走
}
}
int search(int x)
{
int p = 0, res = 0;
for (int i = 30; i >= 0; i -- )
{
int s = x >> i & 1;// 获取第i位二进制表示
if (son[p][!s])// 另一个方向存在 因为是异或运算
{
res += 1 << i;// 1左移i位 或者 res=res*2+!s (*2相当于左移)
p = son[p][!s];
}
else p = son[p][s];// 相同元素 res=res*2+s
}
return res;
}
int main(){
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
{
scanf("%d", &a[i]);
insert(a[i]);
}
int res = 0;
for (int i = 0; i < n; i ++ ) res = max(res, search(a[i]));
printf("%d\n", res);
return 0;
}