題目鏈接
思路:枚舉每個a【i】算貢獻,進行01字典樹取最大異或,但是由於i,j,k要不同,,所以在算a【i】的時候要把a【i】先從字典樹上刪除掉,不過哦貌似這題暴力也能過。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e3+5;
int tree[maxn*32][2],tot,ans=0,a[maxn],num[maxn*32];
void insert(int x)
{
int u=0;
for(int i=31;i>=0;--i)
{
int t=(((1LL<<i)&x)?1:0);
if(!tree[u][t]) tree[u][t]=++tot;
u=tree[u][t];
num[u]++;
}
}
void delet(int x)
{
int u=0;
for(int i=31;i>=0;--i)
{
int t=(((1LL<<i)&x)?1:0);
u=tree[u][t];
num[u]--;
}
}
int query(int x)
{
int u=0,res=0;
for(int i=31;i>=0;--i)
{
int t=(((1LL<<i)&x)?1:0);
if(tree[u][t^1]&&num[tree[u][t^1]]) u=tree[u][t^1],res+=(1LL<<i);
else u=tree[u][t];
}
return res;
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
ans=tot=0;
memset(tree,0,sizeof(tree));
memset(num,0,sizeof(num));
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]),insert(a[i]);
for(int i=1;i<=n;++i)
{
delet(a[i]);
for(int j=i+1;j<=n;++j)
{
delet(a[j]);
ans=max(ans,query(a[i]+a[j]));
insert(a[j]);
}
insert(a[i]);
}
printf("%d\n",ans);
}
}