一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3 aaaaaa aa #
Sample Output
0 3
一点需要注意的就是字串不能重叠
#include<stdio.h>
#include<string.h>
const int maxm = 1005;
char t[maxm],p[maxm];
int next[maxm],lent,lenp,ans;
void getnext()
{
int len = 0;
int i = 1;
next[0] = 0;
while (i<lenp)
{
if (p[i]==p[len])
{
len++;
next[i] = len;
i++;
}
else if (len==0)
i++;
else
len = next[len-1];
}
}
void kmp()
{
int i = 0,j = 0;
while (i<lent && j<lenp)
{
if (t[i]==p[j])
i++,j++;
else if (j==0)
i++;
else
j = next[j-1];
if (j==lenp)
{
ans++;
j = 0;
}
}
}
int main()
{
while(scanf("%s",t)!=EOF && strcmp(t,"#")!=0)
{
scanf("%s",p);
lent = strlen(t);
lenp = strlen(p);
memset(next,0,sizeof(next));
getnext();
ans = 0;
kmp();
printf("%d\n",ans);
}
return 0;
}