您的位置:首页 > 其它

cyk追楠神系列三

2017-02-24 10:59 169 查看

Problem Description

众所周知,cyk给楠神写了一封信表白。作为有一个有礼貌的五好青年,楠神当然得给 cyk 写一封回信咯,俗称“好人信”。
楠神是一个非常有文采的人,他在信里引用了很多名言来安慰 cyk,有时候他觉得一句话很好的话,他会引用很多次。现在他想考考 cyk,在告诉 cyk 里面每句名言的情况下,看看 cyk 能不能找到每局名言在信里被引用了多少次。如果能找到的话,说明 cyk 也是一个有涵养的人,楠神对 cyk 的好感度就会增加。
cyk 语文和眼力那么差,当然不行咯,所以你赶快帮帮 cyk 吧!

Input

输入数据有多组(数据组数不超过 50),到 EOF 结束。
每组数据第一行输入一串字符串,代表楠神写的回信,长度不超过 10^6。
第二行输出 n (1 <= n <= 100),接下来 n 行每行一个字符串,代表楠神引用的名言,长度不超过 10^6。

Output

每组数据中,对于每句名言输出他被引用的次数,每个答案占一行。

Example Input

In fact, maybe we can become good friend, but don't lose hear for yourselves, when there is a will, there is a way, you can become a better man~
1
when there is a will, there is a way


Example Output

1


Hint

子串在主串中的匹配允许重叠。
#include<stdio.h>

#include<string.h>

char s[1000010],t[1000010];

int next[1000020];

int slen,tlen;

void getnext()

{

    int j,k;

    j=0;k=-1;

    next[j]=k;

    while(j<tlen)

    {

        if(k==-1||t[j]==t[k])

        {

            next[++j]=++k;

        }

        else

        {

            k=next[k];

        }

    }

}

int kmp_count()

{

    int i,j,count;

    getnext();

    j=count=0;

    for(i=0;i<slen;i++)

    {

        while(j>0&&s[i]!=t[j])

        {

            j=next[j];

        }

        if(s[i]==t[j])

        {

            j++;

        }

        if(j==tlen)

        {

            count++;

            j=next[j];

        }

    }

    return count;

}

int main()

{

    int n,ans;

    while(gets(s))

    {

        slen=strlen(s);

        scanf("%d",&n);

        getchar();

        while(n--)

        {

            gets(t);

            tlen=strlen(t);

            ans=kmp_count();

            printf("%d\n",ans);

        }

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: