[板子]KMP

KMP板子,你甚至可以用这个板子A掉luogu的3375

基础懒得说,要求一个Next数组。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 using namespace std;
 7 
 8 char a[1000001],b[1001];
 9 int nexta[1001];
10 
11 int main()
12 {
13     int na,nb,i,j,k,w,e,s;
14     
15     scanf("%s%s",a,b);
16     na=strlen(a);
17     nb=strlen(b);
18     
19     for(i=1;i<nb;i++)
20     {
21         j=nexta[i];
22         while(j!=0&&b[i]!=b[j])
23         {
24             j=nexta[j];
25         }
26         if(b[i]==b[j])
27         {
28             nexta[i+1]=j+1;
29         }
30         else
31         {
32             nexta[i+1]=0;
33         }
34     }
35     j=0;
36     for(i=0;i<na;i++)
37     {
38         while(j!=0&&a[i]!=b[j])
39         {
40             j=nexta[j];
41         }
42         if(a[i]==b[j])
43         {
44             j++;
45         }
46         if(j==nb)
47         {
48             printf("%d
",i-nb+2);
49         }
50     }
51     
52     for(j=1;j<=nb;j++)
53     {
54         printf("%d ",nexta[j]);
55     }
56     return 0;
57 }
原文地址:https://www.cnblogs.com/Fylsea/p/7804377.html