John is a manager of a CPU chip factory, the factory produces lots of chips everyday. To manage large amounts of products, every processor has a serial number. More specifically, the factory produces
n chips today, the
i-th chip produced this day has a serial number
si.
At the end of the day, he packages all the chips produced this day, and send it to wholesalers. More specially, he writes a checksum number on the package, this checksum is defined as below:
which i,j,k are three different integers between 1 and n. And ⊕
The first line of each test case is an integer n, indicating the number of chips produced today. The next line has n integers s1,s2,..,sn, separated with single space, indicating serial number of each chip.
1≤T≤1000
3≤n≤1000
0≤si≤109
There are at most 10 testcases with n>100
Output For each test case, please output an integer indicating the checksum number in a line. Sample Input
At the end of the day, he packages all the chips produced this day, and send it to wholesalers. More specially, he writes a checksum number on the package, this checksum is defined as below:
maxi,j,k(si+sj)⊕sk
which i,j,k are three different integers between 1 and n. And ⊕
is symbol of bitwise XOR.
Can you help John calculate the checksum number of today?
Input The first line of input contains an integer
T indicating the total number of test cases.
Can you help John calculate the checksum number of today?
The first line of each test case is an integer n, indicating the number of chips produced today. The next line has n integers s1,s2,..,sn, separated with single space, indicating serial number of each chip.
1≤T≤1000
3≤n≤1000
0≤si≤109
There are at most 10 testcases with n>100
Output For each test case, please output an integer indicating the checksum number in a line. Sample Input
2 3 1 2 3 3 100 200 300Sample Output
6 400
题意:
给你一个序列,然后找出max((arr[i]+arr[j])^arr[k]),i!=j,j!=k,i!=k;
思路:
首先我们不难想到枚举的方法,复杂度n^3*t,em....很明显是不行的,那么我们可不可以做到n^n*t*的复杂度呢,当然可以,有一种叫01字典树的数据结构,可以说是异或神奇了,其中原理也是贪心
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
typedef long long LL;
#define MAX 100000
int n,root,cnt,nxt[MAX][2],word[MAX],arr[10000];
int newnode()
{
cnt++;
for(int i=0;i<=1;i++)
nxt[cnt][i]=-1;
word[cnt]=0;
return cnt;
}
void init()
{
cnt=0;
root=newnode();
}
void insertnode(int x)
{
int u=root;
for(int i=30;i>=0;i--)
{
int v=((1<<i)&x)?1:0;
if(nxt[u][v]==-1)
nxt[u][v]=newnode();
u=nxt[u][v];
word[u]++;
}
}
void deletenode(int x)
{
int u=root;
for(int i=30;i>=0;i--)
{
int v=((1<<i)&x)?1:0;
u=nxt[u][v];
word[u]--;
}
}
int query(int x)
{
int u=root;
for(int i=30;i>=0;i--)
{
int v=((1<<i)&x)?1:0;
if(v==1)
{
if(nxt[u][0]!=-1&&word[nxt[u][0]])
{
u=nxt[u][0];
}
else
{
u=nxt[u][1],x^=(1<<i);
}
}
else
{
if(nxt[u][1]!=-1&&word[nxt[u][1]])
{
u=nxt[u][1],x^=(1<<i);
}
else
{
u=nxt[u][0];
}
}
}
return x;
}
void qq()
{
int u=root;
for(int i=30;i>=0;i--)
{
if(nxt[u][1]!=-1&&word[nxt[u][1]])
{
cout<<1;
u=nxt[u][1];
}
else
{
cout<<0;
u=nxt[u][0];
}
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
int ans=0;
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&arr[i]);
insertnode(arr[i]);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
int temp=arr[i]+arr[j];
deletenode(arr[i]);
deletenode(arr[j]);
ans=max(ans,query(temp));
insertnode(arr[i]);
insertnode(arr[j]);
}
cout<<ans<<endl;
}
return 0;
}