KMP模板题

 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 int pre[1000010],m[1000010];
 5 char p[1000010],q[1000010];
 6 int KMP(int l1,int l2){
 7     int sum=0;
 8     memset(pre,0,sizeof(pre));
 9     memset(m,0,sizeof(m));
10     pre[1]=0;
11     for (int i=2;i<=l1;i++){
12         int j=pre[i-1];
13         while (j&&p[j+1]!=p[i]) j=pre[j];
14         if (p[j+1]==p[i]) j++;
15         pre[i]=j;
16     }
17     m[1]=0;
18     for (int i=1;i<=l2;i++){
19         int j=m[i-1];
20         while (j&&q[i]!=p[j+1]) j=pre[j];
21         if (p[j+1]==q[i]) j++;
22         m[i]=j;
23         if (j==l1){
24             j=pre[j];sum++;
25         }
26     }
27     return sum;
28 }
29 int main(){
30     int Q,lenp,lenq; 
31     scanf("%d",&Q);
32     while (Q--){
33         scanf("%s",p+1);
34         lenp=strlen(p+1);
35         scanf("%s",q+1);
36         lenq=strlen(q+1);
37         printf("%d\n",KMP(lenp,lenq));
38     }
39     return 0;
40 }
STD

 

posted on 2016-10-05 14:02  Absolutezero  阅读(139)  评论(0)    收藏  举报