hdu5269 Chip Factory

地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=5536

题目:

Chip Factory

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


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
 思路:这题居然可以N^3爆过去,我也是惊呆了==,数据太水了吧。正解是01trie。
暴力代码:
#include<stdio.h>
int a[1001];
int max(int ta,int b)
{
    if(ta>b)
        return ta;
    return b;
}
int sc(int ta,int tb,int tc,int ans)
{
    return max(ans,(ta+tb)^tc);
}
int main(void)
{
    int t,n;
    scanf("%d",&t);
    while(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++)
            for(int j=i+1;j<=n;j++)
            for(int k=j+1;k<=n;k++)
            ans=sc(a[i],a[j],a[k],ans),ans=sc(a[j],a[k],a[i],ans),ans=sc(a[i],a[k],a[j],ans);
        printf("%d\n",ans);
    }
    return 0;
}

01trie代码:

#include <stdio.h>
#include <string.h>
struct Trie
{
    int root, tot, next[100001][2], cnt[100001], end[100001];

    inline int Newnode()
    {
        memset(next[tot], -1, sizeof(next[tot]));
        cnt[tot] = 0;
        end[tot] = 0;
        return tot ++;
    }

    inline void Init()
    {
        tot = 0;
        root = Newnode();
    }

    inline void Insert(int x)
    {
        int p = root;
        cnt[p] ++;
        for(int i = 31; i >= 0; i --)
        {
            int idx = ((1 << i) & x) ? 1 : 0;
            if(next[p][idx] == -1)
                next[p][idx] = Newnode();
            p = next[p][idx];
            cnt[p] ++;
        }
        end[p] = x;
    }

    inline void Del(int x)
    {
        int p = root;
        cnt[p] --;
        for(int i = 31; i >= 0; i --)
        {
            int idx = ((1 << i) & x) ? 1 : 0;
            p = next[p][idx];
            cnt[p] --;
        }
    }

    inline int Search(int x)
    {
        int p = root;
        for(int i = 31; i >= 0; i --)
        {
            int idx = ((1 << i) & x) ? 1 : 0;
            if(idx == 0)
            {
                if(next[p][1] != -1 && cnt[next[p][1]])
                    p = next[p][1];
                else
                    p = next[p][0];
            }
            else
            {
                if(next[p][0] != -1 && cnt[next[p][0]])
                    p = next[p][0];
                else
                    p = next[p][1];
            }
        }
        return x ^ end[p];
    }
}tr;
int max(int ta,int tb)
{
    return ta>=tb?ta:tb;
}
int a[1001];
int main(void)
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,ans=0;scanf("%d",&n);
        tr.Init();
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]),tr.Insert(a[i]);
        for(int i=1;i<=n;i++)
        for(int j=i+1;j<=n;j++)
        {
            tr.Del(a[i]),tr.Del(a[j]);
            ans=max(ans,tr.Search(a[i]+a[j]));
            tr.Insert(a[i]),tr.Insert(a[j]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2016-10-05 19:56  weeping  阅读(180)  评论(0编辑  收藏  举报