hdoj 2087 剪花布条

来源:互联网 发布:有趣的跳跃c语言 编辑:程序博客网 时间:2024/05/16 08:42

 

考察点:kmp的 简单应用

 

 

题目大意:输入两个字符串str1,str2,计算出从前面的字符串str1中能够剪出多少个str2,并输出。

 

 

题目解析: 典型的kmp应用,每一次匹配后如果相同,次数加1,不过由于是剪布条,所以一旦剪出符合的str2,只能从剩下的串里面继续匹配,直到最后。

简单来说就是,str2不能重叠出现,一旦匹配成功就要从后面的在重新开始匹配工作。

 

 

AC代码:

#include <stdio.h>#include <string.h>#define m 1200char 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;}


 

0 0
原创粉丝点击