1. 程式人生 > >Chip Factory + trie

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);  
    }  
}