kmp算法 模板

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<cstdio>
 6 using namespace std;
 7 const int maxn = 1000000 + 10 ;
 8 char A[maxn],B[maxn];
 9 int p[maxn];
10 int n,m;
11 void kmp()
12 {
13     int j(0);
14     for(int i=0;i<n;i++)
15     {
16         while(j>0 && B[j+1]!=A[i+1] ) j = p[j];
17         if(B[j+1]==A[i+1]) j++;
18         if(j==m)
19         {
20             printf("%d\n",i+1-m+1);
21             j=p[j];
22         }
23     }
24 }
25 int main()
26 {
27     scanf("%s %s",A+1,B+1);
28     p[1]=0;
29     n=strlen(A+1),m=strlen(B+1);
30     int j(0);
31     p[1]=0;
32     for(int i=1;i<m;i++)
33     {
34         while(j>0 && B[j+1]!=B[i+1]) j=p[j];
35         if(B[j+1]==B[i+1]) j++;
36         p[i+1]=j;
37     }
38     kmp();
39     for(int i=1;i<=m;i++) printf("%d ",p[i]);
40     return 0;
41 }
posted @ 2019-04-18 20:30  寒方  阅读(214)  评论(0编辑  收藏  举报