HDU5536:Chip Factory(字典树)

来源:互联网 发布:开门大吉是假唱知乎 编辑:程序博客网 时间:2024/06/07 22:55

Chip Factory

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


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
 

Source
2015ACM/ICPC亚洲区长春站-重现赛(感谢东北师大)

题意:给N个数,找出(a[i]+a[j])^a[k]的最大值,其中i,j,k,为不同的数。

思路:范围只用1000,可以枚举i,j,每次删掉a[i],a[j]后跑一遍字典树更新最大值即可。

# include <iostream># include <cstdio># include <cstring># include <algorithm>using namespace std;const int maxn = 1e3+3;int arr[maxn], cnt;struct node{    int a[2], sum;}tri[maxn*100];void ins(int x){    int p = 0;    for(int i=31; i>=0; --i)    {        int t = (x>>i)&1;        if(!tri[p].a[t])            tri[p].a[t] = ++cnt;        p = tri[p].a[t];        ++tri[p].sum;    }}void del(int x){    int p = 0;    for(int i=31; i>=0; --i)    {        int t = (x>>i)&1;        p = tri[p].a[t];        --tri[p].sum;    }}int query(int x){    int p = 0, ans = 0;    for(int i=31; i>=0; --i)    {        int t = (x>>i)&1, rev = tri[p].a[!t], cur = tri[p].a[t];        if(rev && tri[rev].sum > 0)            p = rev, ans |= (1<<i);        else            p = cur;    }    return ans;}int main(){    int t, n;    scanf("%d",&t);    while(t--)    {        cnt = 0;        memset(tri, 0, sizeof(tri));        scanf("%d",&n);        for(int i=0; i<n; ++i)            scanf("%d",&arr[i]), ins(arr[i]);        int ans = 0;        for(int i=0; i<n; ++i)        {            del(arr[i]);            for(int j=i+1; j<n; ++j)            {                del(arr[j]);                ans = max(ans ,query(arr[i]+arr[j]));                ins(arr[j]);            }            ins(arr[i]);        }        printf("%d\n",ans);    }    return 0;}



原创粉丝点击