hdu5536 Chip Factory(01字典树)

Chip Factory

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


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
 
  
2 3 1 2 3 3 100 200 300
 

Sample Output
 
  
6 400

题意:求max( (a[i] + a[j]) ^ a[k] ) (i, j, k都不相同)  ^异或

思路:建一个字典树直接找,每次先删除a[i],a[j]然后找出剩下的与a[i]+a[j]的最大异或和,然后然把a[i],a[j]插回去

其实就是一个挺简单的模版题。。。

ac代码:

#include<bits/stdc++.h>

using namespace std;

const int MAXN=100010;
int T_T,n,a[MAXN];

struct Trie
{
    int ch[2],size;
}T[MAXN];

int root=1,tot=1;

void Insert(int x)
{
    int o=root;
    T[o].size++;
    for(int k=30;k>=0;k--)
    {
        int c;
        if(x&(1<<k))
            c=1;
        else
            c=0;
        if(!T[o].ch[c])
         T[o].ch[c]=++tot;

        o=T[o].ch[c];
        T[o].size++;
    }
}

void Delete(int x)
{
    int o=root;
    T[o].size--;
    for(int k=30;k>=0;k--)
    {
        int c;
        if(x&(1<<k)) c=1;
        else c=0;
        o=T[o].ch[c];
        T[o].size--;
    }
}

int Query(int x)
{
    int o=root;
    for(int k=30;k>=0;k--)
    {
        int c;
        if(x&(1<<k)) c=1;
        else c=0;
        if(c==1)
        {
            if(T[o].ch[0]&&T[T[o].ch[0]].size)
                o=T[o].ch[0];
            else
                o=T[o].ch[1],x^=(1<<k);
        }
        else
        {
            if(T[o].ch[1]&&T[T[o].ch[1]].size)
                o=T[o].ch[1],x^=(1<<k);
            else
                o=T[o].ch[0];
        }
    }
    return x;
}

int main()
{
    scanf("%d",&T_T);
    while(T_T--)
    {
        int ans=0;
        scanf("%d",&n);

        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);

        for(int i=1;i<=n;i++)
            Insert(a[i]);

        for(int i=1;i<=n;i++)
        {
            Delete(a[i]);
            for(int j=i+1;j<=n;j++)
            {
                Delete(a[j]);
                ans=max(ans,Query(a[i]+a[j]));
                Insert(a[j]);
            }
            Insert(a[i]);
        }
        printf("%d\n",ans);

        for(int i=1;i<=tot;i++)
        T[i].ch[0]=0,T[i].ch[1]=0,T[i].size=0;

        tot=1;
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/ac_blood/article/details/80072952