kmp的应用,求一个模式串在文本串中出现了几次 如果发现一个匹配后,令j=next[j]即可,即再接下去尝试匹配 代码: #include<iostream> #include<memory.h> #include<string> #include<cstdio> #include<algorithm> #include<math.h> #include<stack> #include<queue> using namespace std; char p[10005]; char t[1000005]; int next[10005]; void get_next(int n) { int i,j; next[1]=j=0; //cout<<p+1<<endl; for(i=2;i<=n;i++) { while(j>0&&p[j+1]!=p[i]) j=next[j]; if(p[j+1]==p[i]) j=j+1; next[i]=j; } } void kmp() { int cnt=0,i,j,len=strlen(t+1),tar=strlen(p+1); get_next(tar); j=0; for(i=1;i<=len;i++) { //cout<<"j="<<j<<endl; while(j>0&&p[j+1]!=t[i]) { j=next[j]; } //cout<<p+1<<endl; if(p[j+1]==t[i]) { //cout<<t[j+1]<<" "<<t[i]<<endl; j++; //cout<<"j="<<j<<endl; } //cout<<i<<" "<<j<<endl; if(j==tar) { cnt++; j=next[j]; } } cout<<cnt<<endl; } int main() { int i,j,n; scanf("%d",&n); while(n--) { scanf("%s%s",p+1,t+1); kmp(); } return 0; }