KMP模板
#include<iostream> #include<cstdio> #include<cstring> #define mxn 1000001 using namespace std; char T[mxn],P[10001]; int f[mxn]; void getfail(){ int i,j,m=strlen(P); for(i=1;i<m;i++){ int j=f[i]; while(j&&P[i]!=P[j]) j=f[j]; f[i+1]=P[i]==P[j]?j+1:0; } } void KMP(){ int n=strlen(T),m=strlen(P); int i,j=0,ans=0; getfail(); for(i=0;i<n;i++){ while(j&&P[j]!=T[i]) j=f[j]; if(P[j]==T[i])j++; if(j==m){ ans++; //printf("%d\n",i-m+2); } } printf("%d\n",ans); } int main(){ int t; scanf("%d",&t); while(t--){ memset(f,0,sizeof(f)); memset(T,0,sizeof(T)); memset(P,0,sizeof(P)); scanf("%s%s",P,T); KMP(); } }