#include <iostream>
#include <cstdio>
#include<algorithm>
using namespace std;
const int N = 1005;
int a[N];
int n,m;
struct Node{
int val;
Node* next[2];
Node(){
val = 0;
next[0] = next[1] = NULL;
}
void add(int number){
Node* tmp = this;
for (int i = 31; i >=0; i--){
int op = (number & (1 << i)) > 0 ? 1:0;
if (tmp->next[op] == NULL){
tmp->next[op] = new Node();
}
tmp = tmp->next[op];
tmp->val++;
}
}
void del(int number){
Node* tmp = this;
for (int i = 31; i >=0; i--){
int op = (number & (1 << i)) > 0 ? 1:0;
tmp = tmp->next[op];
tmp->val--;
}
}
int query(int value){
int ans = 0;
Node* tmp = this;
for (int i = 31; i>=0; i--){
int op = (value & (1 << i)) > 0 ? 1 : 0;
op = op ^ 1;
//为什么这里面不用担心NULL,首先肯定是有一个数在tree中
//那么tree 中肯定存在一条从头到尾的路径.
if (tmp->next[op] && tmp->next[op]->val){
ans += (1 << i);
tmp = tmp->next[op];
}else{
tmp = tmp->next[op^1];
}
}
return ans;
}
};
void del(Node* node){
if (node == NULL)
return;
if (node->next[0]){
del(node->next[0]);
}
if (node->next[1]){
del(node->next[1]);
}
delete(node);
}
int main()
{
int t = 0;
scanf("%d", &t);
Node *node = NULL;
while (t--){
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
del(node);
node = new Node();
for (int i = 0; i < n; i++){
node->add(a[i]);
}
int ans = 0;
for (int i = 0; i < n; i++){
for (int j = i + 1; j < n; j++){
node->del(a[i]);
node->del(a[j]);
ans = max(ans, node->query(a[i] + a[j]));
node->add(a[i]);
node->add(a[j]);
}
}
printf("%d\n", ans);
}
return 0;
}
/*
2
3
1 2 3
3
100 200 300
6
400
*/
HDU 5536 Chip Factory
最新推荐文章于 2019-08-09 19:14:30 发布