题解:
给n个数字从中选择三个数字a[i],a[j],a[k],使得a[i]+a[j]异或a[k]最大
建一个字典树,枚举a[i]+a[j],删除之后查找然后再插回到字典树中,往相反的方向走,没有则同方向走
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
int max(int a,int b)
{
if (a>=b)
return a;
else
return b;
}
const int maxn = 500050;
int Next[maxn][2];
int word[maxn];
struct Tree
{
int L,root;
void init()
{
L = 0;
root = newnode();
}
int newnode()
{
for (int i = 0;i<2;i++)
Next[L][i] = -1;
word[L++] = 0;
return L-1;
}
void insert(int val)
{
int u = root,v;
for (int i = 31;i>=0;i--)
{
v = (val & (1<<i))?1:0;
if (Next[u][v] == -1)
Next[u][v] = newnode();
u = Next[u][v];
word[u]++;
}
}
void Delete(int val)
{
int u = root,v;
for (int i = 31;i>=0;i--)
{
v = (val & (1<<i))?1:0;
u = Next[u][v];
word[u]--;
}
}
int query(int val)
{
int u = root,v;
for (int i = 31;i>=0;i--)
{
v = (val & (1<<i))?1:0;
if (v==1)
{
if (Next[u][0] != -1 && word[Next[u][0]])
u = Next[u][0];
else
{
u = Next[u][1];
val^=(1<<i);
}
}
else
{
if (Next[u][1] != -1 && word[Next[u][1]])
{
u = Next[u][1];
val ^= (1<<i);
}
else
u = Next[u][0];
}
}
return val;
}
};
int a[1005];
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
Tree tree;
tree.init();
int n;
scanf("%d",&n);
for (int i = 0;i<n;i++)
{
scanf("%d",&a[i]);
tree.insert(a[i]);
}
int ans = 0;
for ( int i = 0;i<n;i++)
{
tree.Delete(a[i]);
for (int j = i+1;j<n;j++)
{
tree.Delete(a[j]);
ans = max(tree.query(a[i]+a[j]),ans);
tree.insert(a[j]);
}
tree.insert(a[i]);
}
printf("%d\n",ans);
memset(a,0,sizeof(a));
}
}
题目
Chip Factory
Time Limit:9000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u
HDU 5536
Description
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
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
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.
The first line of each test case is an integer
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 300
Sample Output
6
400