hdu 5536 xor题

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\n",a[i].c,a[i].l,a[i].r);
116 //        printf("%d\n",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\n",maxd);
129     }
130     //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
131     return 0;
132 }
View Code

 

posted @ 2015-11-02 09:23  cdongyang  阅读(389)  评论(0编辑  收藏  举报