hdu 5536 Chip Factory
2015-11-02 21:22
260 查看
Chip Factory
Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 208 Accepted Submission(s): 120
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
题目大意:
在一个数列中找出maxi,j,k(si+sj)⊕sk的
解题思路:
异或其实没有什么好办法,直接模拟也可以暴力过,但是当时没实现我们最后用字典树过的,在一个字典书中加入所有的数,再从树中拿出ai,aj,算完后在加入,计算最大值就好;
麻烦的就删除操作;
代码:
#include "iostream" #include "cstdio" #include "string.h" #include "math.h" using namespace std; const int maxn=1000010; struct Trie { int v,ch[2]; }; Trie node[maxn]; int a[1010]; int num=1,root=0; void Insert(int x) { int u=root; node[u].v++; for(int i=30;i>=0;i--) { int c; if(x&(1<<i)) c=1; else c=0; if(node[u].ch[c]==NULL) node[u].ch[c]=num++; u=node[u].ch[c]; node[u].v++; } } void Delete(int x) { int u=root; node[u].v--; for(int i=30;i>=0;i--) { int c; if(x&(1<<i)) c=1; else c=0; u=node[u].ch[c]; node[u].v--; } } int query(int x) { int u=root; for(int i=30;i>=0;i--) { int c; if(x&(1<<i)) c=1; else c=0; if(c==1) { if(node[u].ch[0]&&node[node[u].ch[0]].v) u=node[u].ch[0]; else { u=node[u].ch[1]; x=x^(1<<i); } } else { if(node[u].ch[1]&&node[node[u].ch[1]].v) { u=node[u].ch[1]; x=x^(1<<i); } else u=node[u].ch[0]; } } return x; } int main(int argc, char* argv[]) { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); memset(node,0,sizeof(node)); num=1; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); Insert(a[i]); } int ans=-1; for(int i=1;i<=n;i++) { Delete(a[i]); for(int j=i+1;j<=n;j++) { Delete(a[j]); ans=max(ans,query(a[i]+a[j])); Insert(a[j]); } Insert(a[i]); } printf("%d\n",ans); } return 0; }
相关文章推荐
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- HDU 1000
- HDU 1001
- hdu-5385
- hdu-5405
- hdu-5490
- HDU 1622 Trees On The Level
- HDU 1063 Exponentiation
- 关于在一定刀数内切一个圆的球,求出切出最多块数的值的数学推论 hdoj 1290