看了一天的KMP 先来一道水题 试试KMp的水深不深然而还是在CE7次之后才过
题目原网址:http://acm.hdu.edu.cn/showproblem.php?pid=2087
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
typedef int ll;
ll nextval[1010];
void getnext(char* p,int nextval[])
{
int plen=strlen(p);
int i,j,k;
k=nextval[0]=-1;
j=0;
while(j<plen)
{
if(k==-1||p[j]==p[k])
{
j++;
k++;
nextval[j]=k;
}
else
{
k=nextval[k];
}
}
}
int kmp(char* s,char* p)
{
int slen=strlen(s);
int plen=strlen(p);
int i=0,j=0;
int number=0;
while(i<slen&&j<plen)
{
if(j==-1||p[j]==s[i])
{
i++;
j++;
}
else
{
j=nextval[j];
}
if(j==plen)
{
number++;
j=0;
}
}
return number;
}
int main()
{
char str[1010];
char sto[1010];
while(cin>>str)
{
if(strcmp(str,"#")==0)
{
break;
}
cin>>sto;
memset(nextval,0,sizeof(nextval));
getnext(sto,nextval);
cout<<kmp(str,sto)<<endl;
memset(str,0,sizeof(str));
memset(sto,0,sizeof(sto));
}
return 0;
}
至于关于KMP的详细介绍 给大家一篇v_JULY_v的博客 上面讲的很详细 http://m.blog.youkuaiyun.com/article/details?id=7041827