一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
Sample Output
0
3
题解:
直接找模板字符串里的查找串,当查找串找到最后一位时计数++然后继续查找。简单的KMP模板题稍加修改
#include <stdio.h>
#include <string.h>
void getnext(char *c,int *next)
{
int len=strlen(c);
int j=-1;
for(int i=0;i<len;i++)
{
while(j!=-1 && c[j+1]!=c[i])
j=next[i];
if(c[j+1]==c[i])
j++;
next[i]=j;
}
}
int main(void)
{
while(1)
{
char s[1000+5];
scanf("%s",s);
if(s[0]=='#')
break;
char t[1000+5];
int next[1000+5];
scanf("%s",t);
getnext(t,next);
int len_s=strlen(s),len_t=strlen(t);
int cot=0;
for(int i=0,j=0;i<=len_s;i++)
{
//printf("%d %d\n",i,j);
if(j==len_t)
{
cot++;
j=0;
}
if(s[i]==t[j])
j++;
else
j-=next[j];
}
printf("%d\n",cot);
}
}