HDU5536 Chip Factory(字典树)
2016-01-15 20:03
302 查看
题解:
给n个数字从中选择三个数字a[i],a[j],a[k],使得a[i]+a[j]异或a[k]最大
建一个字典树,枚举a[i]+a[j],删除之后查找然后再插回到字典树中,往相反的方向走,没有则同方向走
代码
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int max(int a,int b) { if (a>=b) return a; else return b; } const int maxn = 500050; int Next[maxn][2]; int word[maxn]; struct Tree { int L,root; void init() { L = 0; root = newnode(); } int newnode() { for (int i = 0;i<2;i++) Next[L][i] = -1; word[L++] = 0; return L-1; } void insert(int val) { int u = root,v; for (int i = 31;i>=0;i--) { v = (val & (1<<i))?1:0; if (Next[u][v] == -1) Next[u][v] = newnode(); u = Next[u][v]; word[u]++; } } void Delete(int val) { int u = root,v; for (int i = 31;i>=0;i--) { v = (val & (1<<i))?1:0; u = Next[u][v]; word[u]--; } } int query(int val) { int u = root,v; for (int i = 31;i>=0;i--) { v = (val & (1<<i))?1:0; if (v==1) { if (Next[u][0] != -1 && word[Next[u][0]]) u = Next[u][0]; else { u = Next[u][1]; val^=(1<<i); } } else { if (Next[u][1] != -1 && word[Next[u][1]]) { u = Next[u][1]; val ^= (1<<i); } else u = Next[u][0]; } } return val; } }; int a[1005]; int main() { int T; scanf("%d",&T); while (T--) { Tree tree; tree.init(); int n; scanf("%d",&n); for (int i = 0;i<n;i++) { scanf("%d",&a[i]); tree.insert(a[i]); } int ans = 0; for ( int i = 0;i<n;i++) { tree.Delete(a[i]); for (int j = i+1;j<n;j++) { tree.Delete(a[j]); ans = max(tree.query(a[i]+a[j]),ans); tree.insert(a[j]); } tree.insert(a[i]); } printf("%d\n",ans); memset(a,0,sizeof(a)); } }
题目
Chip Factory
Time Limit:9000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64uHDU 5536
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 nn chips today, the ii-th chip produced this day has a serial number sis_i.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\max_{i,j,k} (s_i+s_j) \oplus s_k
which i,j,ki,j,k are three different integers between 11 and nn. And ⊕\oplus is symbol of bitwise XOR.
Can you help John calculate the checksum number of today?
Input
The first line of input contains an integer TT indicating the total number of test cases.The first line of each test case is an integer nn, indicating the number of chips produced today. The next line has nn integers s1,s2,..,sns_1, s_2, .., s_n, separated with single space, indicating serial number of each chip.
1≤T≤10001 \le T \le 1000
3≤n≤10003 \le n \le 1000
0≤si≤1090 \le s_i \le 10^9
There are at most 1010 testcases with n>100n > 100
Output
For each test case, please output an integer indicating the checksum number in a line.Sample Input
23
1 2 3
3
100 200 300
Sample Output
6400
相关文章推荐
- 关于session
- Java源码之HashMap
- SPOJ QTREE 树链剖分
- 【转载】最近在用Arrays的asList()生成的List时,List元素的个数时而不正确,数组转化为List,即Arrays.asList(intArray);
- lintcode :longest common substring 最长公共子串
- [POJ 2010]Moo University - Financial Aid[优先队列]
- B. Drazil and His Happy Friends
- POJ 1611 The Suspects
- canvas--绘制路径
- LightOJ1348 树链剖分
- Max-heap && Min-heap && push_heap
- FZU2082树链剖分
- leetcode--Search a 2D Matrix
- ssh能够连接而sftp不能连接的解决方法
- 怎样理解最小二乘法原理及其用途
- POJ 1287 Networking
- 位运算函数实现float型变量取整数位
- Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
- Windows 下使用命令行编译C/C++文件
- HYSBZ1036 树链剖分