01字典树,不知为啥自己写的东西
#include<bits/stdc++.h>
#define read(x) scanf("%d",&x)
using namespace std;
const int maxn=1e5+2;
struct Trie{
int ch[2],cnt;
}t[maxn];
int a[maxn];
int c=1,tot=1;
void Insert(int x) {
int o=c;
t[o].cnt++;
for(int k=30;k>=0;k--) {
int cc;
if(x&(1<<k))cc=1;
else cc=0;
if(!t[o].ch[cc]) t[o].ch[cc]=++tot;
o=t[o].ch[cc];
t[o].cnt++;
}
}
void Delete(int x) {
int o=c;
t[o].cnt--;
for(int k=30;k>=0;k--) {
int cc;
if(x&(1<<k))cc=1;
else cc=0;
o=t[o].ch[cc];
t[o].cnt--;
}
}
int Find(int x) {
int o=c;
for(int k=30;k>=0;k--) {
int cc;
if(x&(1<<k))cc=1;
else cc=0;
if(cc==1) {
if(t[o].ch[0] && t[t[o].ch[0]].cnt) {
o=t[o].ch[0];
}
else {
o=t[o].ch[1],x^=(1<<k);
}
}
else {
if(t[o].ch[1]&&t[t[o].ch[1]].cnt) {
o=t[o].ch[1],x^=(1<<k);
}
else {
o=t[o].ch[0];
}
}
}
return x;
}
int main() {
int T;
read(T);
while(T--) {
int n;
for(int i=1;i<=tot;i++) {
t[i].ch[0]=t[i].ch[1]=t[i].cnt=0;
}
tot=1;
read(n);
for(int i=1;i<=n;i++) {
read(a[i]);
Insert(a[i]);
}
// puts("#@%");
int ans=0;
for(int i=1;i<=n;i++) {
Delete(a[i]);
// puts("#$%");
for(int j=i+1;j<=n;j++) {
Delete(a[j]);
ans=max(ans,Find(a[i]+a[j]));
Insert(a[j]);
}
Insert(a[i]);
}
printf("%d\n",ans);
}
}
自带100倍常数