HDU5536 Chip Factory(字典树)

来源:互联网 发布:软件评分表 编辑:程序博客网 时间:2024/06/17 00:34

题解:

给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 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:

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.

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.

1T1000
3n1000
0si109
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

0 0
原创粉丝点击