/*
求一些数字中 两两异或 的最大值
用树吧个数字存起来(二叉树,根据其各位来分支)
某数跟它的反(~a)的异或最大,所以要从高位向低位寻找尽量满足其反的数字,他们的异或最大
*/
#include<stdio.h>
struct node
{
int l,r;
__int64 a;
}p[200000];
int n,yong;
__int64 max,a;
void build()
{
int i=0,cur=0,zhen;
for(i=31;i>=0;i--)
{
zhen=a&1<<i;
if(zhen)
{
if(p[cur].r==0)
{
p[cur].r=yong;
p[yong].l=p[yong].r=0;
cur=yong;
yong++;
}else
{
cur=p[cur].r;
}
}else
{
if(p[cur].l==0)
{
p[cur].l=yong;
p[yong].l=p[yong].r=0;
cur=yong;
yong++;
}else
{
cur=p[cur].l;
}
}
}
p[cur].a=a;
}
void m()
{
int cur=0,i,zhen;
__int64 x=~a,xx;//之前写成|a
for(i=31;i>=0;i--)
{
zhen=x&1<<i;
if(zhen)
{
if(p[cur].r)
{
cur=p[cur].r;
}else
{
cur=p[cur].l;
}
}else
{
if(p[cur].l)
{
cur=p[cur].l;
}else
{
cur=p[cur].r;
}
}
}
xx=a^p[cur].a;
if(xx>max)
max=xx;
}
int main()
{
int i;
//freopen("data.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
yong=1;
max=0;
scanf("%I64d",&a);
build();
for(i=1;i<n;i++)
{
scanf("%I64d",&a);
m();
build();
}
printf("%I64d\n",max);
}
}
异或最大--位运算--~非--zzuli1675
最新推荐文章于 2020-06-03 23:48:33 发布