您的位置:首页 > 其它

HDU 5536 Chip Factory

2015-11-11 20:25 274 查看

Chip Factory

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


[align=left]Problem Description[/align]

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

[align=left]Output[/align]
For each test case, please output an integer indicating the checksum number in a line.

[align=left]Sample Input[/align]

2

3

1 2 3

3

100 200 300

[align=left]Sample Output[/align]

6

400

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

解题:很明显这种题目用字典树,今年的多校有一道类似的但是难度更大的题目

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
struct Trie {
int ch[maxn][2],cnt[maxn],tot;
int newnode() {
cnt[tot] = ch[tot][0] = ch[tot][1] = 0;
return tot++;
}
void init() {
tot = 0;
newnode();
}
void update(int v,int d,int rt = 0) {
for(int i = 30; i >= 0; --i) {
int c = (v>>i)&1;
if(!ch[rt][c]) ch[rt][c] = newnode();
rt = ch[rt][c];
cnt[rt] += d;
}
}
int match(int v,int rt = 0,int ret = 0) {
for(int i = 30; i >= 0; --i) {
int c = (v>>i)&1;
if(ch[rt][c^1] && cnt[ch[rt][c^1]]) {
ret |= 1<<i;
rt = ch[rt][c^1];
} else rt = ch[rt][c];
}
return ret;
}
}T;
int a[maxn];
int main() {
int kase,n,ret;
scanf("%d",&kase);
while(kase--){
scanf("%d",&n);
T.init();
for(int i = 0; i < n; ++i){
scanf("%d",a + i);
T.update(a[i],1);
}
for(int i = ret = 0; i < n; ++i){
T.update(a[i],-1);
for(int j = i + 1; j < n; ++j){
T.update(a[j],-1);
ret = max(ret,T.match(a[i] + a[j]));
T.update(a[j],1);
}
T.update(a[i],1);
}
printf("%d\n",ret);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: