Chip Factory + trie
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
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int const MAX = 1e5; int a[MAX]; struct Trie { int root, tot, next[MAX][2], cnt[MAX], end[MAX]; inline int Newnode() { memset(next[tot], -1, sizeof(next[tot])); cnt[tot] = 0; end[tot] = 0; return tot ++; } inline void Init() { tot = 0; root = Newnode(); } inline void Insert(int x) { int p = root; cnt[p] ++; for(int i = 31; i >= 0; i --) { int idx = ((1 << i) & x) ? 1 : 0; if(next[p][idx] == -1) next[p][idx] = Newnode(); p = next[p][idx]; cnt[p] ++; } end[p] = x; } inline void Del(int x) { int p = root; cnt[p] --; for(int i = 31; i >= 0; i --) { int idx = ((1 << i) & x) ? 1 : 0; p = next[p][idx]; cnt[p] --; } } inline int Search(int x) { int p = root; for(int i = 31; i >= 0; i --) { int idx = ((1 << i) & x) ? 1 : 0; if(idx == 0) { if(next[p][1] != -1 && cnt[next[p][1]]) p = next[p][1]; else p = next[p][0]; } else { if(next[p][0] != -1 && cnt[next[p][0]]) p = next[p][0]; else p = next[p][1]; } } return x ^ end[p]; } }tr; int main() { int T; scanf("%d", &T); while(T--) { tr.Init(); int n, ma = 0; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &a[i]); tr.Insert(a[i]); } for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { tr.Del(a[i]); tr.Del(a[j]); ma = max(ma, tr.Search(a[i] + a[j])); tr.Insert(a[i]); tr.Insert(a[j]); } } printf("%d\n", ma); } }