HDU

来源:互联网 发布:canonmg3680清零软件 编辑:程序博客网 时间:2024/06/16 08:08

题目大意:

题目大意:
中文题,题目背景就不说了,抽象化就是给你两个字符串,问你把第一个字符串切成若干条,能得到多少第二个字符串。

代码:

#include<iostream>#include<math.h>#include<stdio.h>#include<string.h>#define maxn 1050using namespace std;char m[maxn];char a[maxn];int my_next[maxn];void build_next(){    my_next[0]=-1;    int k=-1,j=0;    while(m[j]!=0)    {        if(k!=-1&&m[j]!=m[k])        {            k=my_next[k];continue;        }        j++;k++;        if(m[j]==m[k])my_next[j]=my_next[k];        else my_next[j]=k;    }}int lm,la;int main(){    while(scanf("%s",a))    {        if(a[0]=='#')break;        scanf("%s",m);        lm=strlen(m);        la=strlen(a);        if(la<lm)        {            printf("0\n");            continue;        }        build_next();        int num=0;        int j=0,i=0;        while(1)        {            if(i>=la)break;            if(a[i]!=m[j])            {                j=my_next[j];                if(j==-1)                {                    i++;j++;                }                continue;            }            i++;j++;            if(j==lm)            {                num++;                j=0;            }        }        printf("%d\n",num);        memset(m,0,sizeof(m));        memset(a,0,sizeof(a));        memset(my_next,0,sizeof(my_next));    }}