• HDU 5536 Chip Factory


    Chip Factory

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


    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.

    1≤T≤1000
    3≤n≤1000
    0≤si≤109
    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
     
    Source
     
    解题:很明显这种题目用字典树,今年的多校有一道类似的但是难度更大的题目
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 100010;
     4 struct Trie {
     5     int ch[maxn][2],cnt[maxn],tot;
     6     int newnode() {
     7         cnt[tot] = ch[tot][0] = ch[tot][1] = 0;
     8         return tot++;
     9     }
    10     void init() {
    11         tot = 0;
    12         newnode();
    13     }
    14     void update(int v,int d,int rt = 0) {
    15         for(int i = 30; i >= 0; --i) {
    16             int c = (v>>i)&1;
    17             if(!ch[rt][c]) ch[rt][c] = newnode();
    18             rt = ch[rt][c];
    19             cnt[rt] += d;
    20         }
    21     }
    22     int match(int v,int rt = 0,int ret = 0) {
    23         for(int i = 30; i >= 0; --i) {
    24             int c = (v>>i)&1;
    25             if(ch[rt][c^1] && cnt[ch[rt][c^1]]) {
    26                 ret |= 1<<i;
    27                 rt = ch[rt][c^1];
    28             } else rt = ch[rt][c];
    29         }
    30         return ret;
    31     }
    32 }T;
    33 int a[maxn];
    34 int main() {
    35     int kase,n,ret;
    36     scanf("%d",&kase);
    37     while(kase--){
    38         scanf("%d",&n);
    39         T.init();
    40         for(int i = 0; i < n; ++i){
    41             scanf("%d",a + i);
    42             T.update(a[i],1);
    43         }
    44         for(int i = ret = 0; i < n; ++i){
    45             T.update(a[i],-1);
    46             for(int j = i + 1; j < n; ++j){
    47                 T.update(a[j],-1);
    48                 ret = max(ret,T.match(a[i] + a[j]));
    49                 T.update(a[j],1);
    50             }
    51             T.update(a[i],1);
    52         }
    53         printf("%d
    ",ret);
    54     }
    55     return 0;
    56 }
    View Code
  • 相关阅读:
    部分类Partial
    Ajax之XMLHttpRequest
    C#结构(Struct)
    sql数据管理语句
    mysql基本语句
    bootstrap插件-滚动监听
    一轮项目学习总结
    js滚动监听
    Ajax
    各框架、插件记录
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4957275.html
Copyright © 2020-2023  润新知