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
 
解题:很明显这种题目用字典树,今年的多校有一道类似的但是难度更大的题目
 #include <bits/stdc++.h>
using namespace std;
const int maxn = ;
struct Trie {
int ch[maxn][],cnt[maxn],tot;
int newnode() {
cnt[tot] = ch[tot][] = ch[tot][] = ;
return tot++;
}
void init() {
tot = ;
newnode();
}
void update(int v,int d,int rt = ) {
for(int i = ; i >= ; --i) {
int c = (v>>i)&;
if(!ch[rt][c]) ch[rt][c] = newnode();
rt = ch[rt][c];
cnt[rt] += d;
}
}
int match(int v,int rt = ,int ret = ) {
for(int i = ; i >= ; --i) {
int c = (v>>i)&;
if(ch[rt][c^] && cnt[ch[rt][c^]]) {
ret |= <<i;
rt = ch[rt][c^];
} 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 = ; i < n; ++i){
scanf("%d",a + i);
T.update(a[i],);
}
for(int i = ret = ; i < n; ++i){
T.update(a[i],-);
for(int j = i + ; j < n; ++j){
T.update(a[j],-);
ret = max(ret,T.match(a[i] + a[j]));
T.update(a[j],);
}
T.update(a[i],);
}
printf("%d\n",ret);
}
return ;
}

最新文章

  1. 都别说工资低了,我们来一起写简单的dom选择器吧!
  2. 二十五、JDK1.5新特性---枚举
  3. 禁用 baloo_file_extractor 加速 ubuntu 14.04 (KDE)
  4. tarjan求桥、割顶
  5. Java [leetcode 22]Generate Parentheses
  6. GUI编程笔记(java)05:GUI事件监听机制原理和举例说明
  7. 去掉Visual Studio 编辑器里中文注释的红色波浪线 转载
  8. 有效解决js中添加border后动画bug问题
  9. [BZOJ 3052] [wc2013] 糖果公园 【树上莫队】
  10. sort 命令
  11. 秒味课堂Angular js笔记------指令
  12. 【课上OJ】掉入陷阱的数
  13. Windows提供了两种将DLL映像到进程地址空间的方法
  14. Java如何调取创蓝253短信验证码
  15. UNIX环境高级编程——线程同步之条件变量以及属性
  16. tomcat用redis做session共享
  17. python+unittet在linux与windows使用的区别
  18. mysql分组查询获取组内某字段最大的记录
  19. 性能测试常用的linux命令
  20. iOS开发之--如何修改TabBarItem的title的字体和颜色/BarButtonItem的title的字体大小和颜色/添加背景图片,并添加点击方法

热门文章

  1. SQL SERVER 2008中使用VARBINARY(MAX)进行图像存取的实现方法
  2. win10安装CAD后出现致命错误
  3. Android 6.0 运行时权限处理完全解析 (摘抄)
  4. JAVA的程序基本结构和数据类型
  5. 通过StringBuilder的reverse()实现倒序
  6. UVA 1349 Optimal Bus Route Design (二分图最小权完美匹配)
  7. Python 入门基础
  8. javascript(函数式编程思考) ---&gt; Map-Filter-quicksort-Collatz序列-Flodl-Flodr
  9. Redis数据库(一)
  10. Linux&ndash;varnish(一)