#include <iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int N=35000;
struct Trie{
LL ch[N][2],sz;
int val[N],ed[N];
void Init(){ memset(ch[0],0,sizeof(ch[0])); sz=1;}
void Insert(LL x)
{
int u=0;
for(int i=32;i>=0;i--)
{
int v=(x&(1ll<<i))>0?1:0;
if(!ch[u][v])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;//每个节点的附加信息
ed[sz]=0;
ch[u][v]=sz++;//存储该节点的编号sz
}
u=ch[u][v];
val[u]++;
}
ed[u]=x;//最后一个节点记录数值
}
void Delete(LL x)
{
int u=0;
for(int i=32;i>=0;i--)
{
int v=(x&(1ll<<i))>0?1:0;
u=ch[u][v];
val[u]--;
}
//ed[u]=0;可能有重复数字,若置为0后该位置的另一个数字也被删除了
}
int Search(LL x)
{
int u=0;
for(int i=32;i>=0;i--)
{
int v=(x&(1ll<<i))>0;//判断条件
if(ch[u][!v]&&val[ch[u][!v]])
{
u=ch[u][!v];
}
else u=ch[u][v];
}
return x^ed[u];
}
}trie;
int main()
{
int T,m,n;
scanf("%d",&T);
for(int k=1;k<=T;k++)
{
scanf("%d",&n);
int j,i;
trie.Init();
LL a[1005],b;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
trie.Insert(a[i]);
}
LL maxn=-1;
for(i=1;i<=n;i++)
{
trie.Delete(a[i]);
for(j=i+1;j<=n;j++)
{
trie.Delete(a[j]);
int t=a[i]+a[j];
int tmp=trie.Search(t);
if(tmp>maxn) maxn=tmp;
trie.Insert(a[j]);
}
trie.Insert(a[i]);
}
printf("%d\n",maxn);
}
return 0;
}
hdu5536(字典树的插入和删除)
最新推荐文章于 2023-09-16 12:02:38 发布