基本上是裸的KMP。
虽然我 现在KMP思想没有完全理解透彻。但是凭借着一点微不足道的理解和模板也能A掉此题。
#include <iostream> #include <string> using namespace std; #define MAX 1000005 int next1[MAX]; int sum; void GetNext(string t) { int i=0; int j=-1; while(i<(int)t.size()) if(j==-1||t[i]==t[j]) { ++i; ++j; next1[i]=j; } else j=next1[j]; } void KMP(string s,string t) { GetNext(t); int i=0,j=0; int slen = (int)s.size(); int tlen = (int)t.size(); while(i<slen&&j<tlen) if(j==-1||s[i]==t[j]) { if(j==tlen-1) { sum++; ++i; j=0;//成功匹配后,不退出从头再来,开始匹配 } else { ++i; ++j; } } else { j=next1[j]; } } int main() { string s; while(cin>>s) { if(s=="#") break; string t; cin>>t; getchar(); sum=0; next1[0]=-1; KMP(s,t); printf("%d ",sum); } return 0; }