标签:
Time Limit: 18000/9000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 620 Accepted Submission(s): 318
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
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 100010; 4 struct Trie { 5 int ch[maxn][2],cnt[maxn],tot; 6 int newnode() { 7 cnt[tot] = ch[tot][0] = ch[tot][1] = 0; 8 return tot++; 9 } 10 void init() { 11 tot = 0; 12 newnode(); 13 } 14 void update(int v,int d,int rt = 0) { 15 for(int i = 30; i >= 0; --i) { 16 int c = (v>>i)&1; 17 if(!ch[rt][c]) ch[rt][c] = newnode(); 18 rt = ch[rt][c]; 19 cnt[rt] += d; 20 } 21 } 22 int match(int v,int rt = 0,int ret = 0) { 23 for(int i = 30; i >= 0; --i) { 24 int c = (v>>i)&1; 25 if(ch[rt][c^1] && cnt[ch[rt][c^1]]) { 26 ret |= 1<<i; 27 rt = ch[rt][c^1]; 28 } else rt = ch[rt][c]; 29 } 30 return ret; 31 } 32 }T; 33 int a[maxn]; 34 int main() { 35 int kase,n,ret; 36 scanf("%d",&kase); 37 while(kase--){ 38 scanf("%d",&n); 39 T.init(); 40 for(int i = 0; i < n; ++i){ 41 scanf("%d",a + i); 42 T.update(a[i],1); 43 } 44 for(int i = ret = 0; i < n; ++i){ 45 T.update(a[i],-1); 46 for(int j = i + 1; j < n; ++j){ 47 T.update(a[j],-1); 48 ret = max(ret,T.match(a[i] + a[j])); 49 T.update(a[j],1); 50 } 51 T.update(a[i],1); 52 } 53 printf("%d\n",ret); 54 } 55 return 0; 56 }
标签:
原文地址:http://www.cnblogs.com/crackpotisback/p/4957275.html