【HDOJ5536】Chip Factory(Trie树)

题意:给定n个数字,第i个数字为a[i],求max((a[i]+a[j])^a[k]),其中i,j,k互不相同

n<=1000,0<=a[i]<=1e9

思路:队友写的,抱大腿

先对于a[i]建立Trie树

枚举i和j后删除Trie中的i和j,然后就是经典的Trie树应用:优先朝与a[i]+a[j]的当前位不同的方向走,能获得最大xor和

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define LL long long  
 4 const int maxn=1e3+5;
 5 int a[maxn*maxn][2];
 6 int b[maxn],num[maxn*maxn*2],tot;
 7 void init()
 8 {
 9     tot=1;
10 }
11 void insert (int x)
12 {
13     int rt=1;
14     for(int i=30;i>=0;i--)
15     {
16         int g=(x>>i)&1;
17         if(a[rt][g]==0)
18         {
19             a[rt][g]=++tot;
20         }
21         rt=a[rt][g];
22         num[rt]++;
23     }
24 }
25 void del(int x)
26 {
27     int rt=1;
28     for(int i=30;i>=0;i--)
29     {
30         int g=(x>>i)&1;
31         rt=a[rt][g];
32         num[rt]--;
33     }
34 }
35 int find(int x)
36 {
37     int rt=1;
38     int sum=0;
39     for(int i=30;i>=0;i--)
40     {
41         int g=(x>>i)&1;
42     //    printf("%d %d %d\n",g,a[rt][!g],a[rt][g]);
43         if(a[rt][!g]==0||num[a[rt][!g]]==0)
44         {
45             rt=a[rt][g];
46         }
47         else
48         {
49         //    printf("i = %d\n",i);
50             rt=a[rt][!g];
51             sum+=1<<i;
52         }
53         //printf("%d\n",sum);
54     }
55     return sum;
56 }
57 int main()
58 {
59     int T;
60     scanf("%d",&T);
61     while(T--)
62     {
63         init();
64         int n;
65         scanf("%d",&n);
66         for(int i=1;i<=n;i++)
67         {
68             scanf("%d",&b[i]);
69             insert(b[i]);
70         }
71         int ma=0;
72         for(int i=1;i<=n;i++)
73             for(int j=i+1;j<=n;j++)
74             {
75                 del(b[i]);
76                 del(b[j]);
77             //    printf("%d\n",find(b[i]+b[j]));
78             //    puts("sdadas");
79                 ma=max(ma,find(b[i]+b[j]));
80                 insert(b[i]);
81                 insert(b[j]);
82             }
83         for(int i=0;i<=tot;i++)
84         {
85             a[i][0]=a[i][1]=0;
86             num[i]=0;
87         }
88         printf("%d\n",ma);
89     }
90 }

 

posted on 2018-10-30 20:28  myx12345  阅读(138)  评论(0编辑  收藏  举报

导航