坑
-
位数限制一定是31,而不是30
y总的代码可能无所谓,但是下述写法用到了减,如果是31会超存储范围,导致刚开始就是负数,出现很奇怪的bug
可以将30改成31试试,就明白了 -
更新节点的时候,
p = son[][]
, 而不能是p = idx
,因为有判断,所以无法包括所有情况,会出错
代码
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 1e5 * 32;
int son[N][2], idx;
int a[N];
void Insert(int x)
{
int p = 0;
for (int i = 30; i >= 0; i --)
{
int t;
if (x < 1 << i) t = 0;
else t = 1, x -= 1<<i;
if (!son[p][t]) son[p][t] = ++idx;
p = son[p][t];
}
}
int Search(int x)
{
int p = 0;
int res = 0;
for (int i = 30; i >= 0; i --)
{
int t;
if (x < 1 << i)
{
if (son[p][1]) res += 1 << i, p = son[p][1];
else p = son[p][0];
}else{
x -= 1<<i;
if (son[p][0]) res += 1 << i, p = son[p][0];
else p = son[p][1];
}
}
return res;
}
int main ()
{
int n;
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", res);
return 0;
}
/*
10
181262 369842 1036879 546331 868986 496157 646816 459571 215643 448018
*/