CodeupKMP算法:动物简介(animal)

问题 A: 动物简介(animal)

时间限制: 1 Sec  内存限制: 64 MB
提交: 234  解决: 78
[提交][状态][讨论版][命题人:外部导入]

题目描述

到了动物园,琦琦开心得跳起来。哗,这里好多动物呀,有老虎,有狮子……,在开心之余,琦琦也不忘妈妈的教导:观察动物时要认真仔细,还要看动物园附上的动物简介呀。
动物的简介原来还有英文版的呢!为了卖弄自己的英文水平,琦琦就告诉妈妈每张动物简介里出现了多少次该动物的名称。注意:琦琦只认识小写字母,而且她只认得动物的单词,因此她认为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

#include<bits/stdc++.h>
using namespace std;
const int maxn=300;
int nextval[maxn];
void getNextval(string str){
	int j=-1;
	nextval[0]=-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++;//令j指向原nextval[i]的位置 
		}
		if(j==-1||str[i+1]!=str[j+1]){
			nextval[i]=j;
		}else{
			nextval[i]=nextval[j];
		}
	}
} 
//KMP算法统计str2在str1中出现的次数 
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(cin>>n){
		getchar();
		getline(cin,str1);
		getNextval(str1);
		ans=0;
		for(int i=0;i<n;i++){
			getline(cin,str2);
			ans+=KMP(str2,str1);
		}
		cout<<ans<<endl;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值