#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
void get_nxt(int nxt[], string t)
{
int i=0;
int j=1;
nxt[0]=0;
while(j<t.size())
{
if(t[i]!=t[j])
{
if(i==0)
nxt[j++]=0;
else
i=nxt[i-1];
}
else
nxt[j++]=++i;
}
}
int kmp(string s, string t )
{
int nxt[1005];
int i=0;
int j=0;
int cnt=0;
get_nxt(nxt,t);
while(i<s.size())
{
if(s[i]==t[j])
{
++i;
++j;
}
else
{
if(j!=0)
j=nxt[j-1];
else
i++;
}
if(j==t.size())
{
cnt++;
j=0;
}
}
return cnt;
}
int main()
{ string s,p;
while(cin>>s && s!="#" && cin>>p)//当s为#时,就不进行p的判断输入
printf("%d\n", kmp(s,p));
}
nxt数组(模式串的自我匹配)
此处nxt数组的值便是最大长度值
关于i值回溯问题参考kmp算法详解
其中一图特别易懂
kmp的实现与nxt数组的实现大同小异