利用next[]的转化。
//#include <bits/stdc++.h> #include<cstdio> #include<string.h> #include<algorithm> using namespace std; const int N=1e3+10; char p[N],s[N]; int lenp,lens,Next[N]; void GetNext(){ int i=0,j=-1; Next[0]=-1; while(i<lenp) { if(j==-1||p[i]==p[j]) Next[++i]=++j; else j=Next[j]; } } int KMP() { int i=0,j=0,ans=0; while(i<lens) { if(j==-1||s[i]==p[j]) { i++; j++; if(j==lenp) { ans++; j=0; } } else j=Next[j]; } return ans; } int main() { while(scanf("%s",s)) { if(strcmp(s,"#")==0) break; scanf("%s",p); lens=strlen(s); lenp=strlen(p); GetNext(); printf("%d ",KMP()); } return 0; }