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