hdu 5536 xor题

时间:2023-03-08 20:08:28
hdu 5536 xor题

input

1<=T<=1000

3<=n<=1000

s1 s2 ... sn 0<=si<=10e9

最多十个样例n>=100

output

max((a[i]+a[j])^a[k]) i!=j!=k

做法,将s数组建成一颗01字典树,枚举a[i]+a[j]找最大,找之前要把a[i]和a[j]删掉,找完后再插入

 #include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <ctime>
#define bit 31 using namespace std; struct node
{
int c,l,r;
}; node a[];
int s[],n,T; void erase(int x)
{
int u=;
for(int i=bit;i>=;i--)
{
if(x&(<<i))
{
u=a[u].r;
a[u].c--;
}
else
{
u=a[u].l;
a[u].c--;
}
}
} void insert(int x)
{
int u=;
for(int i=bit;i>=;i--)
{
if(x&(<<i))
{
u=a[u].r;
a[u].c++;
}
else
{
u=a[u].l;
a[u].c++;
}
}
} int find(int x)
{
int ans=,u=;
for(int i=bit;i>=;i--)
{
if(x&(<<i))//bit位为1
{
if(a[u].l&&a[a[u].l].c)//能往左走就加1<<i
{
ans+=<<i;
u=a[u].l;
}
else u=a[u].r;//不能往左走就往右走
}
else
{
if(a[u].r&&a[a[u].r].c)
{
ans+=<<i;
u=a[u].r;
}
else u=a[u].l;
}
}
return ans;
} int main()
{
freopen("/home/user/桌面/in","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(a,,sizeof(a[])*(n+)*);
int root,idx=,maxd=-;
for(int i=;i<n;i++)//建树
{
scanf("%d",&s[i]);
root=;
for(int j=bit;j>=;j--)
{
if(s[i]&(<<j))
{
if(!a[root].r) a[root].r=idx++;
root=a[root].r;
a[root].c++;
}
else
{
if(!a[root].l) a[root].l=idx++;
root=a[root].l;
a[root].c++;
}
}
}
// for(int i=0;i<idx;i++) printf("%d %d %d\n",a[i].c,a[i].l,a[i].r);
// printf("%d\n",idx);
for(int i=;i<n;i++)
{
erase(s[i]);
for(int j=i+;j<n;j++)
{
erase(s[j]);
maxd=max(find(s[i]+s[j]),maxd);
insert(s[j]);
}
insert(s[i]);
}
printf("%d\n",maxd);
}
//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
return ;
}