以前做过的一道水题,今天用KMP做了一下。
#include<stdio.h>
#include<string.h>
#define N 1005
int next[N];
void setNext(char *s)
{
int ln;
int i,j;
ln=strlen(s);
i=0;j=-1;
next[i]=j;
while(i<ln)
{
if(j==-1||s[i]==s[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
return ;
}
int main()
{
char s1[N],s2[N];
while(scanf("%s",s1),s1[0]!='#')
{
scanf("%s",s2);
int i,j;
setNext(s2);
int cnt,ln1,ln2;
ln1=strlen(s1);
ln2=strlen(s2);
j=0;i=0;
cnt=0;
while(i<ln1)
{
if(j==-1||s1[i]==s2[j])
{
i++;
j++;
if(j==ln2)
{
cnt++;
j=0;
}
}
else
j=next[j];
}
printf("%d\n",cnt);
}
return 0;
}