游客 Signup | Login
中文 | En

2477 - 动物简介(animal) (1046)

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

Input

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

Output

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

Examples

Input

1
monkey
She often jumps onto my knees. I like to give her a bath.

Output

0

Solution C++

#include <bits/stdc++.h> 
using namespace std;
int nextval[300];
void getnextval(string s){
	int j=-1;
	nextval[0]=-1;
	for(int i=0;i<s.size();i++){
		while(j!=-1&&s[i]!=s[j+1]){
			j=nextval[j];
		}
		if(s[i]==s[j+1]) j++;
		if(j==-1||s[i+1]!=s[j+1]) nextval[i]=j;
		else nextval[i]=nextval[j];
	}
}
int KMP(string text,string pattern){
	int n=text.size(),m=pattern.size();
	getnextval(pattern);
	int ans=0,j=-1;
	for(int i=0;i<n;i++){
		while(j!=-1&&text[i]!=pattern[j+1]){
			j=nextval[j];
		}
		if(text[i]==pattern[j+1]) j++;
		if(j==m-1){
			ans++;
			j=nextval[j];
		}
	}
	return ans;
}
int main(){
	string pattern;
	int n,i;
	int num=0;
	cin>>n;
	getchar();
	cin>>pattern;
	getchar();
	for(i=0;i<n;i++){
		string text;
		getline(cin,text);
		num+=KMP(text,pattern);
	}
	cout<<num<<endl;
	return 0;
}
Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题