http://acm.hdu.edu.cn/showproblem.php?pid=5536
暴力枚举ij 删除后将ij之和与剩余序列异或取最大值 01字典树模板题
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int c[2];
int cnt;
};
node tree[500010];
int pre[50];
int ary[1010];
int n,q,num;
void init()
{
int i;
pre[0]=1;
for(i=1;i<=31;i++) pre[i]=2ll*pre[i-1];
}
int getnode()
{
tree[num].c[0]=tree[num].c[1]=tree[num].cnt=0;
num++;
return num-1;
}
void update(int val,int det)
{
int cur,i,id;
cur=0;
for(i=31;i>=0;i--)
{
id=1&(val>>i);
if(tree[cur].c[id]==0) tree[cur].c[id]=getnode();
tree[tree[cur].c[id]].cnt+=det;
cur=tree[cur].c[id];
}
}
int query(int val)
{
int res;
int cur,i,id;
cur=0,res=0;
for(i=31;i>=0;i--)
{
id=1&(val>>i);
if(tree[tree[cur].c[id^1]].cnt>0)
{
cur=tree[cur].c[id^1];
res+=pre[i];
}
else
{
cur=tree[cur].c[id];
}
}
return res;
}
int main()
{
int ans,val;
int t,i,j;
init();
scanf("%d",&t);
while(t--)
{
scanf("%d%",&n);
num=0;
getnode();
for(i=1;i<=n;i++)
{
scanf("%d",&ary[i]);
update(ary[i],1);
}
ans=0;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
val=ary[i]+ary[j];
update(ary[i],-1);
update(ary[j],-1);
ans=max(ans,query(val));
update(ary[i],1);
update(ary[j],1);
}
}
printf("%d\n",ans);
}
return 0;
}