【模板】KMP字符串匹配

题面

模板题(不过这题是完全版,用简化版的建议嫖部分tj)

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 int n,m;
 8 int next[1000005];
 9 char a[1000005],b[1000005];
10 
11 int kmp()
12 {
13 int j=0;
14 
15     for(int i=1;i<=n;i++)
16     {
17           
18         while(j&&b[j+1]!=a[i])
19         j=next[j];
20           
21         if(b[j+1]==a[i]) 
22         j++;
23           
24         if (j==m) 
25         {
26         printf("%d\n",i-m+1);
27         j=next[j]; 
28         }
29     
30     }
31  
32 return 0;    
33 }
34 
35 int ycl()
36 {
37 int j=0;
38 
39     for (int i=2;i<=m;i++)
40     {     
41     
42     while(j&&b[i]!=b[j+1])
43     j=next[j];
44          
45     if(b[j+1]==b[i])
46     j++;
47         
48     next[i]=j;
49     }
50     
51 return 0;
52 }
53 
54 int main()
55 {
56 
57 scanf("%s%s",a+1,b+1);
58 n=strlen(a+1);
59 m=strlen(b+1);
60 
61 ycl();
62 kmp();
63 
64 for(int i=1;i<=m;i++)
65 printf("%d ",next[i]);
66 
67 return 0;
68 }
69  

 

posted @ 2019-07-05 13:56  [jackeylove]  阅读(263)  评论(0编辑  收藏  举报