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;
}
相关文章推荐
- cyk追楠神系列二
- cyk追楠神系列一
- sdutacm-cyk追楠神系列一
- cyk追楠神系列三
- cyk追楠神系列一
- SDUT 3775 cyk追楠神系列三 典型的KMP类型题目
- ASP.NET AJAX入门系列(2):使用ScriptManager控件
- 整合系列之二--------------Struts 2整合MyFaces(16)
- [转]C# 3.0 入门系列(一)
- Helloj2ee WPF书评系列——缘起
- 一步一步学Silverlight 2系列(10):使用用户控件 (转)
- ARM嵌入式学习自顶向下从入门到精通系列目录(2011-11-23更新)
- Ipad开发课程系列目录--很好的教程,推荐给大家
- 【Android学习系列】OpenGL开发教程二
- RHEL6入门系列之十八,阶段练习2
- HDU2870----DP_最大子矩阵系列(同HDU1505,1506)
- Linux系列-Linux多命令协作:管道及重定向
- Marvell 98DX51xx / 98DX81xx 系列交换芯片 内部初始化
- iOS开发系列--C语言之基础知识
- 【Python系列】01-Python简介