codechef 两题

前面做了这场比赛,感觉题目不错,放上来。

A题目:对于数组A[],求A[U]&A[V]的最大值,因为数据弱,很多人直接排序再俩俩比较就过了。

其实这道题类似百度之星资格赛第三题XOR SUM,不过他求得是XOR最大值,原理类似。。

B:KMP居然写搓了,后来一直改,题目放个链接好了:http://www.codechef.com/LTIME14/problems/TASHIFT。

我么可以对B字符串复制一下,然后再对A字符串求出NEXT数组,再匹配的过程中求出匹配最大长度时的位置,

刚开始我没想到这种做法,然后是先求出NEXT数组,然后二分,具体看代码。CODECHEF好像不能赛后交,代码的正确性。。

 1 T#include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 #include<vector>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 #include<list>
11 #define inf 0x3f3f3f
12 typedef long long ll;
13 using namespace std;
14 char s[1234567];
15 char ss[1234567];
16 int next[1234567];
17 int n;
18 
19 void kmp()
20 {
21     int k=-1,i=0;
22     memset(next,0,sizeof(next));
23     next[0]=-1;
24     while (i<n)
25     {
26         if (k==-1||s[k]==s[i])
27            next[++i]=++k;
28         else k=next[k];
29     }
30 }
31 
32 int getkmp(int x)
33 {
34     int k=0,i=0;
35     while (i<(2*n-1)&&k<x)
36     {
37         if (k==-1||ss[i]==s[k])
38         {
39             k++;i++;
40         }
41         else k=next[k];
42     }
43     if (k==x) return i-x;
44     return -1;
45 }
46 
47 
48 int main()
49 {
50     scanf("%d",&n);
51     scanf("%s%s",s,ss);
52     kmp();
53     int ans=0;
54     for (int i=n;i<n+n-1;i++) ss[i]=ss[i-n];
55     ss[n+n-1]='\n';
56     int h=0,t=n;
57 
58     for (int o=0;o<40;o++)
59      {
60        int  mid=(h+t)/2;
61         if (getkmp(mid)!=-1) {h=mid;ans=getkmp(mid);}
62         else t=mid;
63      }
64  printf("%d\n",ans);
65  return 0;
66 }
View Code

另外附百度之星XOR SUM的01字典树代码:

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<math.h>
 5 #include<string>
 6 using namespace std;
 7 #define N 3333333
 8 int next[N][2],end[N];
 9 int pos;
10 void add(int cur,int k) {
11     next[pos][0]=next[pos][1]=0;
12     end[pos]=0;
13     next[cur][k]=pos++;
14 }
15 
16 int cal(int x)
17 {
18     int cur=0;
19     for (int i=30;i>=0;i--){
20         int 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 end[cur];
25 }
26 
27 int main()
28 {
29     int T;
30     scanf("%d",&T);
31     for (int o=1;o<=T;o++)
32     {
33         int n,m;
34         scanf("%d%d",&n,&m);
35         pos=1;
36         memset(next[0],0,sizeof(next[0]));
37         for (int i=0;i<n;i++) {
38             int x;
39             scanf("%d",&x);
40             int cur=0;
41             for (int j=30;j>=0;j--)
42             {
43                 int  k=0;
44                 if ((1<<j)&x) k=1;
45                 if (next[cur][k]==0) add(cur,k);
46                 cur=next[cur][k];
47             }
48             end[cur]=x;
49         }
50         printf("Case #%d:\n",o);
51         for (int i=0;i<m;i++){
52           int x;
53           scanf("%d",&x);
54           int ans=cal(x);
55           printf("%d\n",ans);
56         }
57     }
58     return 0;
59 }
View Code

 

posted on 2014-07-29 10:58  forgot93  阅读(267)  评论(0编辑  收藏  举报

导航