csu 10月 月赛 F 题 ZZY and his little friends

一道字典树异或的题,但是数据比较水,被大家用暴力给干掉了!

以前写过一个类似的题,叫做the longest xor in tree;

两个差不多吧!

好久没写字典树了,复习一下!

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 100010
 5 using namespace std;
 6 int n,v[maxn],node,next[maxn][2],end[maxn];
 7 
 8 void add(int cur,int k)
 9 {
10     memset(next[node],0,sizeof(next[node]));
11     end[node]=0;
12     next[cur][k]=node++;
13 }
14 
15 int cal(int x)
16 {
17     int i,k,cur=0;
18     for(i=30;i>=0;i--)
19     {
20         k=((1<<i)&x)?0:1;
21         if(next[cur][k]) cur=next[cur][k];
22         else cur=next[cur][1-k];
23     }
24     return (x^end[cur]);
25 }
26 
27 int main()
28 {
29     int k,x,cur,ans,cp;
30     while(!scanf("%d%d",&n,&cp)!=EOF)
31     {
32         node=1,ans=0;
33         memset(next[0],0,sizeof(next[0]));
34         for(int i=0;i<n;i++)
35         {
36             scanf("%d",&x);
37             v[i]=x;
38             cur=0;
39             for(int j=30;j>=0;j--)
40             {
41                 k=((1<<j)&x)?1:0;
42                 if(next[cur][k]==0) add(cur,k);
43                 cur=next[cur][k];
44             }
45             end[cur]=x;
46         }
47         for(int i=0;i<n;i++)ans=max(ans,cal(v[i]));
48         if(ans>cp)puts("YES");
49         else puts("NO");
50     }
51     return 0;
52 }
View Code

 

另一种写法:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define maxn 100005
 5 using namespace std;
 6 
 7 struct node
 8 {
 9     node *p[2];
10 } no[maxn];
11 int w[30],nocount;
12 
13 node *newnode()
14 {
15     node *v=no+nocount++;
16     for(int i=0;i<2;i++)v->p[i]=NULL;
17     return v;
18 }
19 
20 void insert()
21 {
22     node *nono=no;
23     for(int i=29;i>=0;i--)
24     {
25         if(nono->p[w[i]]==NULL)
26             nono->p[w[i]]=newnode();
27             nono=nono->p[w[i]];
28     }
29 }
30 
31 int cal()
32 {
33     int ans=0;
34     node *nono=no;
35     for(int i=29;i>=0;i--)
36     {
37         if(nono->p[1-w[i]]!=NULL){ans+=(1<<i);nono=nono->p[1-w[i]];}
38         else if(nono->p[w[i]]!=NULL){nono=nono->p[w[i]];}
39     }
40     return ans;
41 }
42 
43 int main()
44 {
45     int n,m,x;
46     while(scanf("%d%d",&n,&m)!=EOF)
47     {
48         memset(no,0,sizeof no);
49         nocount=1;
50         int mm=0;
51         for(int i=0; i<n; i++)
52         {
53             scanf("%d",&x);
54             for(int i=0;i<30;i++){w[i]=x%2,x>>=1;}
55             if(i!=0)mm=max(mm,cal());
56             insert();
57         }
58         if(mm>m)puts("YES");
59         else puts("NO");
60     }
61     return 0;
62 }
View Code

 

posted @ 2013-10-02 22:52  Yours1103  阅读(187)  评论(0编辑  收藏  举报