考察点:kmp 的 简单应用
题目大意:输入两个字符串str1,str2,计算出从前面的字符串str1中能够剪出多少个str2,并输出。
题目解析: 典型的kmp应用,每一次匹配后如果相同,次数加1,不过由于是剪布条,所以一旦剪出符合的str2,只能从剩下的串里面继续匹配,直到最后。
简单来说就是,str2不能重叠出现,一旦匹配成功就要从后面的在重新开始匹配工作。
AC代码:
#include <stdio.h>
#include <string.h>
#define m 1200
char str[m],buf[m*2];
int next[m];
int len1,len2,cont;
void getnext() // 将主串分成适宜匹配的模式
{
int i=0,j=-1;
next[i]=j;
len1=strlen(str);
while(i<len1-1)
{
if(j==-1||str[i]==str[j])
{
i++,j++;
next[i]=j;
}
else j=next[j];
}
}
int kmp()
{
getnext();
int i=0,j=0;
cont=0;
len1=strlen(str);
len2=strlen(buf);
while(i<len2)
{
if(j==-1||str[j]==buf[i]) // 符合匹配条件
{
i++,j++;
if(j==len1) cont++; //一次匹配成功
}
else j=next[j]; // 不符合条件直接下跳
}
return cont;
}
int main()
{
while(scanf("%s",buf)&&buf[0]!='#') //对应题目中输入’#’输入结束的要求
{
scanf("%s",str);
printf("%d\n",kmp()); //输出匹配成功的次数,即剪出的数量
}
return 0;
}