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
相关文章推荐
- java 异常在实际应用中的总结
- KVC中setValuesForKeysWithDictionary:(写的不错)
- android studio文件名颜色分别表示什么
- Git 的简单使用
- 学习网站
- 使用MySql自带的库进行数据库连接时可能产生的一些问题
- typedef int (*init_fnc_t)(void);的理解
- Python列表
- Web工程中配置文件路径问题
- 【C#】RGB,CMYK,HSB各种颜色表示的转换(转)
- ACM学习历程—POJ 3764 The xor-longest Path(xor && 字典树 && 贪心)
- [原]横向滑动的HorizontalListView滑动指定位置的解决方法
- Python基本语法及优缺点
- Intent 拨打电话
- c++ 11 多线线程系列-----thread
- 黑马程序员-OC加强回顾-内存管理
- hdu 3033 I love sneakers!
- 32/64位操作系统&&应用程序详解(英文资料)
- 【设计模式】——单例模式
- ASP.NET Redis 开发