2790 Problem A 动物简介(animal)

问题 A: 动物简介(animal)

时间限制: 1 Sec  内存限制: 64 MB
提交: 88  解决: 27
 

题目描述

到了动物园,琦琦开心得跳起来。哗,这里好多动物呀,有老虎,有狮子……,在开心之余,琦琦也不忘妈妈的教导:观察动物时要认真仔细,还要看动物园附上的动物简介呀。
动物的简介原来还有英文版的呢!为了卖弄自己的英文水平,琦琦就告诉妈妈每张动物简介里出现了多少次该动物的名称。注意:琦琦只认识小写字母,而且她只认得动物的单词,因此她认为monkeys或者smonkey或者smonkeys都是出现了monkey这个词。
你能编程完成琦琦的任务吗?

输入

 输入文件共n+2行:
第1行为数字n(n<=3000),表示该动物的简介共有n行。
第2行为一个单词,表示琦琦认识的动物名称。
接着是n行,每行为一个长度小于250个字符的字符串,表示动物的简介。

输出

 输出文件共1行,为简介里出现了多少次琦琦能识别出的动物的单词。

样例输入

2
snake
The snake is a long and thin animal.
Snakes have no legs or feet.

样例输出

1

经验总结

经典的KMP匹配算法~

正确代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <iostream> 
#include <string>
using namespace std;
const int maxn=300;
int nextval[maxn];
void getNextval(string str)
{
	int j=-1;
	for(int i=1;i<str.length();++i)
	{
		while(j!=-1&&str[i]!=str[j+1])
		{
			j=nextval[j];
		}
		if(str[i]==str[j+1])
		{
			++j;
		}
		if(j==-1||str[i+1]!=str[j+1])
		{
			nextval[i]=j;
		}
		else
		{
			nextval[i]=nextval[j];
		}
	}
}
int KMP(string str1,string str2)
{
	int ans=0,j=-1;
	int n=str1.length(),m=str2.length();
	for(int i=0;i<n;++i)
	{
		if(j!=-1&&str1[i]!=str2[j+1])
		{
			j=nextval[j];
		}
		if(str1[i]==str2[j+1])
		{
			++j;
		}
		if(j==m-1)
		{
			ans++;
			j=nextval[j];
		}
	}
	return ans;
}
int main()
{
	int n,ans;
	string str1,str2;
	while(~scanf("%d",&n))
	{
		getchar();
		getline(cin,str1);
		getNextval(str1);
		ans=0;
		for(int i=0;i<n;++i)
		{
			getline(cin,str2);
			ans+=KMP(str2,str1);
		}
		printf("%d\n",ans);
	}
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值