题目大意:
解决: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;
}
浙公网安备 33010602011771号