最简单的KMP题,找出第一个字符串在第二个字符串中出现次数 #include <iostream> 点击打开链接 #include <cstdio> #include <cstring> #define Memset(x, a) memset(x, a, sizeof(x)) using namespace std; const int N=1e6+10; char w[N],t[N]; int next[N]; int sum; void getNext(const char P[],int next[]){ int m=strlen(P); int i=0,j; j=next[0]=-1; while(i<m){ while(-1!=j && P[i]!=P[j])j=next[j]; next[++i]=++j; } } void kmp(const char T[],const char P[],int next[]){ int n=strlen(T),m=strlen(P); int i,j; getNext(P,next); i=j=0; while(i<n){ while(-1!=j && T[i]!=P[j])j=next[j]; i++;j++; if(j>=m){ sum++; j=next[j];//这儿修改很重要,不然会超时 } } } int main(){ int T; scanf("%d",&T); while(T--){ sum=0; Memset(next,0); scanf("%s%s",w,t); kmp(t,w,next); printf("%d\n",sum); } return 0; }