题目大意:给你许多个字符串看一共有多少个"doge"。延用了hdoj一贯的“好长一段题目百分之九十九是废话”的取题风格
kmp基础题,先把输入的字符串str里的字母变成小写(for…tolower(str[i])),然后和doge对比,看里面有多少个doge。
#include<iostream>
#include<string>
using namespace std;
#define maxn 100
int nextt[maxn];
int ans=0;
void cal_next(string ptr)
{
int k=-1;
nextt[0]=-1;
for(int i=1;i<ptr.size();i++)
{
while(k>-1&&ptr[i]!=ptr[k+1])
{
k=nextt[k];
}
if(ptr[k+1]==ptr[i])
k++;
nextt[i]=k;
}
}
void kmp(string str,string ptr)
{
int k=-1;
for(int i=0;i<str.size();i++)
{
while(k!=-1&&str[i]!=ptr[k+1])
{
k=nextt[k];
}
if(str[i]==ptr[k+1])
{
k++;
}
if(k==ptr.size()-1)
{
ans++;
k=-1;//记住一个字符串可能有好多个doge,要把k调回-1
}
}
}
int main()
{
string str;
string ptr="doge";
cal_next(ptr);
while(cin>>str)
{
for(int i=0;i<str.size();i++)
{
if(isalpha(str[i]))
{
str[i]=tolower(str[i]);
}
}
kmp(str,ptr);
}
cout<<ans<<endl;
}