前言
重新写了KMP的模板,这回完全照搬《算法导论》P926的伪代码。
题目大意
给出两个字符串,问第二个字符串中存在多少个字串能与第一个字符串匹配。
思路
KMP模板题。
代码
#include<iostream> #include<stdio.h> using namespace std; #define T_SIZE 1000000 #define P_SIZE 10000 int next[P_SIZE+2]; char T[T_SIZE+2],P[P_SIZE+2]; //T是被匹配的串。 //P是模式串。 void COMPUTE_PREFIX_FUNCTION(char P[]) { int m=strlen(P+1); next[1]=0; for(int k=0,q=2;q<=m;q++) { while(k>0&&P[k+1]!=P[q]) k=next[k]; if(P[k+1]==P[q]) k++; next[q]=k; } } int KMP_MATCHER(char T[],char P[]) { int n=strlen(T+1),m=strlen(P+1); COMPUTE_PREFIX_FUNCTION(P); int sum=0; for(int i=1,q=0;i<=n;i++) { while(q>0&&P[q+1]!=T[i]) q=next[q]; if(P[q+1]==T[i]) q++; if(q==m) { sum++; q=next[q]; } } return sum; } int main() { int t; for(scanf("%d",&t);t>0;t--) { scanf("%s%s",P+1,T+1); //字符串都是从下标1开始的。 printf("%d\n",KMP_MATCHER(T,P)); } }