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
原文地址:https://www.cnblogs.com/crackpotisback/p/4957275.html