题意: 给你n个数,求(h[a]+h[b])^h[c] 的最大值,要求a,b,c互不相同
解法,我们通过枚举两个数 来利用高位贪心判断 构造最大值(这里要用到字典树)
#include <cstdio>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <map>
#include <bitset>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
struct tire
{
int next[100010][2],end[100010];
int root,L;
int newnode()
{
for(int i=0; i<=1; i++)
{
next[L][i]=-1;
}
end[L++]=0;
return L-1;
}
void init()
{
L=0;
root=newnode();
}
void insert(int x)
{
int now=root;
end[now]++;
for(int i=30; i>=0; i--)
{
if(next[now][(x&(1<<i))==0?0:1]==-1)
{
next[now][(x&(1<<i))==0?0:1]=newnode();
}
now=next[now][(x&(1<<i))==0?0:1];
end[now]++;
}
}
void del(int x)
{
int now=root;
end[now]--;
for(int i=30; i>=0; i--)
{
int as=(x&(1<<i))==0?0:1;
now=next[now][as];
end[now]--;
}
}
int query(int x)
{
int ans=0;
int now=root;
for(int i=30; i>=0; i--)
{
if(x&(1<<i))
{
if(next[now][0]!=-1&&end[next[now][0]])
{
ans|=(1<<i);
now=next[now][0];
}
else
{
now=next[now][1];
}
}
else
{
if(next[now][1]!=-1&&end[next[now][1]])
{
ans|=(1<<i);
now=next[now][1];
}
else
{
now=next[now][0];
}
}
}
return ans;
}
};
int h[1010];
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
tire a;
scanf("%d",&n);
a.init();
for(int i=1; i<=n; i++)
{
scanf("%d",&h[i]);
a.insert(h[i]);
}
int ans=0;
for(int i=1; i<=n; i++)
{
a.del(h[i]);
for(int j=i+1; j<=n; j++)
{
a.del(h[j]);
int x=a.query(h[i]+h[j]);
a.insert(h[j]);
ans=max(ans,x);
}
a.insert(h[i]);
}
printf("%d\n",ans);
}
return 0;
}