题目大意:
解决:kmp,与poj3461神似,只需做小小的改动即可
#include <iostream> #include <cstring> #include <cstdio> using namespace std; char s[1005],t[1005]; int next[1005],lens,lent; void getnext() { int i=1,j=0; next[1]=0; while(i<=lent) { if(j==0 || t[i]==t[j]) { i++; j++; next[i]=j; } else j=next[j]; } } void kmp() { int i=1,j=1,cnt=0; while(i<=lens) { if(j==0 || s[i]==t[j]) { i++;j++;//由于是非重复数据,所以j要退回到1就行了,从头匹配 if(j>lent){cnt++;j=1;} } else j=next[j]; } printf("%d\n",cnt); } int main() {//由于这个地方忘记了要从s+1,和t+1开始,一直在调试,竟然忘了 while(scanf("%s%s",s+1,t+1),s[1]!='#') { lens=strlen(s+1); lent=strlen(t+1); getnext(); kmp(); } // system("pause"); return 0; }