问题 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;
}
}