HDU5536 Chip Factory(01字典树)

来源:互联网 发布:java post 二进制 编辑:程序博客网 时间:2024/06/01 09:13

Chip Factory

Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 1643    Accepted Submission(s): 754


Problem 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
231 2 33100 200 300
 

Sample Output
6400
 题意:n个物品,每个物品有一个编号,求任意两个物品和在除他俩的集合内的最大异或值。
题解:
基础01字典树,我们n^2枚举和。剩下操作为01字典树基础操作。
代码:
#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <cmath>#include <queue>#include <stack>#include <algorithm>#define mem(a) memset(a, 0, sizeof(a))#define LL long long#define eps 1e-5#define MAX  10000#include <unordered_map>using namespace std;int  t,a;int ch[32*MAX][2];LL val[32*MAX];int num[32*MAX];int sz;LL b[MAX];void init(){    mem(ch[0]);    sz=1;}void inser(LL a){    int u=0;    for(int i=32;i>=0;i--){        int c=((a>>i)&1);        if(!ch[u][c]){            mem(ch[sz]);            val[sz]=0;            num[sz]=0;            ch[u][c]=sz++;        }        u=ch[u][c];        num[u]++;    }    val[u]=a;}void update(LL a,int d){    int u=0;    for(int i=32;i>=0;i--){        int c=((a>>i)&1);        u=ch[u][c];        num[u]+=d;    }}LL query(LL a){    int u=0;    for(int i=32;i>=0;i--){        int c=((a>>i)&1);        if(ch[u][c^1]&&num[ch[u][c^1]]) u=ch[u][c^1];        else u=ch[u][c];    }    return a^val[u];}int main(){    scanf("%d",&t);    while(t--)    {        init();        scanf("%d",&a);        for(int i=0;i<a;i++)        {            scanf("%d",&b[i]);            inser(b[i]);        }        LL maxn=0;        for(int i=0;i<a;i++)        {            for(int j=0;j<a;j++)        {            if(i==j)                continue;            update(b[i],-1);            update(b[j],-1);            maxn=max(maxn,query(b[i]+b[j]));            update(b[i],1);            update(b[j],1);        }        }        printf("%d\n",maxn);    }}


0 0
原创粉丝点击