KMP 剪花布条 hdu 2078

来源:互联网 发布:qsfp28光模块端口 编辑:程序博客网 时间:2024/05/29 16:43

额……这个题不难,但是因为有个地方制仗了,所以特地写出来……

#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>using namespace std;const int maxn = 1e3+10;char s[maxn],p[maxn];int Next[maxn];int num=0;void GetNext(char *p){    memset(Next,0,sizeof(Next));    Next[0]=-1;    int k=-1;    int i=0;    int plen=strlen(p);    while(i<plen-1)//可以有重叠部分,改为plen-1,就不能啦    {        if(k==-1||p[i]==p[k])        {            k++;            i++;            Next[i]=k;//下一个的之前的最大前缀后缀        }        else k=Next[k];    }}int kmp(char *s,char *p){    GetNext(p);    int i=0,j=0;    int slen=strlen(s);    int plen=strlen(p);    while(i<slen)    {        if(j==plen) {num++;j=Next[j];}        if(j==-1||p[j]==s[i])        {            i++;            j++;        }        else j=Next[j];    }     if(j==plen) {num++;}    return num;}int main(){    while(scanf("%s",s)!=EOF)    {        if(s[0]=='#') break;//WA了好几发,因为这里写成了s=="#",兄弟,字符串之间可以这样比较么............        scanf("%s",p);        num=0;        printf("%d\n",kmp(s,p));    }    return 0;}
原创粉丝点击