题目大意:
在一个数组中找出 (s[i]+s[j])^s[k] 最大的值,其中 i、j、k 各不相同。
数据范围太小了 做法见代码:
#include<bits/stdc++.h>
using namespace std;
using ll =long long ;
constexpr int M=1005;
ll res,tot,t[M*33][2],val[M*33],num[M*33],a[M],T,n;
void insert(ll x,ll rt=0){
for(ll id,i=32;i>=0;i--){
id=(x>>i)&1;
if(!t[rt][id]) t[rt][id]=++tot;
rt=t[rt][id];
num[rt]++;
}
val[rt]=x;
}
void update(ll x,ll ad,ll rt=0){
for(ll id,i=32;i>=0;i--){
id=(x>>i)&1;
rt=t[rt][id];
num[rt]+=ad;
}
}
ll ask(ll x,ll rt=0){
for(ll id,i=32;i>=0;i--){
id=(x>>i)&1;
if( t[rt][id^1] && num[t[rt][id^1]] )rt=t[rt][id^1];
else rt=t[rt][id];
}
return x^val[rt];
}
int main(){
scanf("%lld",&T);
while(T--){
for(register int i=0;i<32000;i++)
t[i][0]=t[i][1]=num[i]=val[i]=0;
res=tot=0;
scanf("%lld",&n);
for(ll i=1;i<=n;i++) scanf("%lld",&a[i]),insert(a[i]);
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
if(i==j)continue;
update(a[i],-1);update(a[j],-1);
res=max(res,ask(a[i]+a[j]));
update(a[i],1);update(a[j],1);
}
}
printf("%lld\n",res);
}
return 0;
}