input
1<=T<=1000
3<=n<=1000
s1 s2 ... sn 0<=si<=10e9
最多十个样例n>=100
output
max((a[i]+a[j])^a[k]) i!=j!=k
做法,将s数组建成一颗01字典树,枚举a[i]+a[j]找最大,找之前要把a[i]和a[j]删掉,找完后再插入

1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 #include <iostream> 5 #include <cstdlib> 6 #include <algorithm> 7 #include <vector> 8 #include <map> 9 #include <set> 10 #include <ctime> 11 #define bit 31 12 13 using namespace std; 14 15 struct node 16 { 17 int c,l,r; 18 }; 19 20 node a[40000]; 21 int s[1010],n,T; 22 23 void erase(int x) 24 { 25 int u=0; 26 for(int i=bit;i>=0;i--) 27 { 28 if(x&(1<<i)) 29 { 30 u=a[u].r; 31 a[u].c--; 32 } 33 else 34 { 35 u=a[u].l; 36 a[u].c--; 37 } 38 } 39 } 40 41 void insert(int x) 42 { 43 int u=0; 44 for(int i=bit;i>=0;i--) 45 { 46 if(x&(1<<i)) 47 { 48 u=a[u].r; 49 a[u].c++; 50 } 51 else 52 { 53 u=a[u].l; 54 a[u].c++; 55 } 56 } 57 } 58 59 int find(int x) 60 { 61 int ans=0,u=0; 62 for(int i=bit;i>=0;i--) 63 { 64 if(x&(1<<i))//bit位为1 65 { 66 if(a[u].l&&a[a[u].l].c)//能往左走就加1<<i 67 { 68 ans+=1<<i; 69 u=a[u].l; 70 } 71 else u=a[u].r;//不能往左走就往右走 72 } 73 else 74 { 75 if(a[u].r&&a[a[u].r].c) 76 { 77 ans+=1<<i; 78 u=a[u].r; 79 } 80 else u=a[u].l; 81 } 82 } 83 return ans; 84 } 85 86 int main() 87 { 88 freopen("/home/user/桌面/in","r",stdin); 89 scanf("%d",&T); 90 while(T--) 91 { 92 scanf("%d",&n); 93 memset(a,0,sizeof(a[0])*(n+2)*31); 94 int root,idx=1,maxd=-1; 95 for(int i=0;i<n;i++)//建树 96 { 97 scanf("%d",&s[i]); 98 root=0; 99 for(int j=bit;j>=0;j--) 100 { 101 if(s[i]&(1<<j)) 102 { 103 if(!a[root].r) a[root].r=idx++; 104 root=a[root].r; 105 a[root].c++; 106 } 107 else 108 { 109 if(!a[root].l) a[root].l=idx++; 110 root=a[root].l; 111 a[root].c++; 112 } 113 } 114 } 115 // for(int i=0;i<idx;i++) printf("%d %d %d ",a[i].c,a[i].l,a[i].r); 116 // printf("%d ",idx); 117 for(int i=0;i<n;i++) 118 { 119 erase(s[i]); 120 for(int j=i+1;j<n;j++) 121 { 122 erase(s[j]); 123 maxd=max(find(s[i]+s[j]),maxd); 124 insert(s[j]); 125 } 126 insert(s[i]); 127 } 128 printf("%d ",maxd); 129 } 130 //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC); 131 return 0; 132 }