学了一晚上,总算把KMP算法的最基本的地方看明白了,Orz各位大佬。
网上有很多KMP算法的讲解,这个大佬讲的我看明白了
这个题很简单,就是在模板上加上找出一个后把j重置就行了。
code:
#include <queue>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const double eps = 1e-10;
const int maxn = 1000+5;
char s[maxn],p[maxn];
int Next[maxn];
void getNext(char x[],int len)
{
int i,j;
j = Next[0] = -1;
i = 0;
while(i < len)
{
while(-1 != j && x[i] != x[j])
j = Next[j];
Next[++i] = ++j;
}
}
int kmp_count(char x[],int xlen,char y[],int ylen)
{
int i=0;
int j=0;
getNext(x,xlen);
int ans=0;
while(i<ylen)
{
while(-1!=j&&y[i]!=x[j])
j=Next[j];
i++;
j++;
if(j>=xlen)
{
ans++;
j=0;//重置j
}
}
return ans;
}
int main()
{
while(scanf("%s",p)!=EOF)
{
if(p[0]=='#')
break;
scanf("%s",s);
int res=kmp_count(s,strlen(s),p,strlen(p));
printf("%d\n",res);
}
return 0;
}