【无聊放个模板系列】POJ2752 EXKMP

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 #define Maxn 400010
10 
11 char s[Maxn];
12 int l,nt[Maxn];
13 
14 int mymin(int x,int y) {return x<y?x:y;}
15 
16 void exkmp()
17 {
18     int mx=0,id=0;
19     nt[1]=l;
20     for(int i=2;i<=l;i++)
21     {
22         int k;
23         if(i<mx) k=mymin(nt[i-id+1],mx-i+1);
24         else k=0;
25         while(s[k+1]==s[i+k]&&i+k<=l) k++;
26         nt[i]=k;
27         if(i+nt[i]-1>mx) mx=i+nt[i]-1,id=i;
28     }
29 }
30 
31 int main()
32 {
33     while(scanf("%s",s+1)!=EOF)
34     {
35         l=strlen(s+1);
36         exkmp();
37         // for(int i=1;i<=l;i++) printf("%d ",nt[i]);printf("\n");
38         for(int i=l;i>=1;i--)
39         {
40             if(nt[i]==l-i+1) printf("%d ",l-i+1);
41         }
42         printf("\n");
43     }
44     return 0;
45 }

 

exkmp

 

2016-11-17 19:31:47

 


 

再来:

POJ 3461

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<cmath>
 8 using namespace std;
 9 #define Maxn 10010
10 #define Maxm 1000010
11 
12 char s[Maxn],ss[Maxm];
13 int l1,l2;
14 
15 int nt[Maxn],td[Maxm];
16 
17 int mymin(int x,int y) {return x<y?x:y;}
18 
19 void exkmp()
20 {
21     int mx=0,id=0;
22     for(int i=2;i<=l1;i++)
23     {
24         int k;
25         if(i<mx) k=mymin(nt[i-id+1],mx-i+1);
26         else k=0;
27         while(s[1+k]==s[i+k]&&i+k<=l1) k++;
28         nt[i]=k;
29         if(nt[i]+i-1>mx) mx=nt[i]+i-1,id=i;
30     }
31     // for(int i=2;i<=l1;i++) printf("%d ",nt[i]);
32     // printf("\n");
33     
34     mx=0,id=0;
35     for(int i=1;i<=l2;i++)
36     {
37         int k;
38         if(i<mx) k=mymin(nt[i-id+1],mx-i+1);
39         else k=0;
40         while(s[1+k]==ss[i+k]&&i+k<=l2&&1+k<=l1) k++;
41         td[i]=k;
42         if(i+td[i]-1>mx) mx=td[i]+i-1,id=i;
43     }
44 }
45 
46 int main()
47 {
48     int T;
49     scanf("%d",&T);
50     while(T--)
51     {
52         scanf("%s%s",s+1,ss+1);
53         l1=strlen(s+1);
54         l2=strlen(ss+1);
55         exkmp();
56         int ans=0;
57         for(int i=1;i<=l2;i++) if(td[i]==l1) ans++;
58         printf("%d\n",ans);
59     }
60     return 0;
61 }

 

posted @ 2016-11-17 19:27  konjak魔芋  阅读(386)  评论(0编辑  收藏  举报