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 }
浙公网安备 33010602011771号