#include <iostream>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 2005;
#define eps 1e-8
#define INIT(x) memset(x,0,sizeof(x))
typedef long long ll;
string s2,s1;
int nxt[maxn];
void get_next(string s)
{
nxt[0] = -1;
nxt[1] = 0;
int cn = 0;
int i = 2;
while(i<s.length())
{
if(s[i-1]==s[cn])
nxt[i++] = ++cn;
else if(cn>0)
cn = nxt[cn];
else
nxt[i++] = 0;
}
}
int kmp()
{
INIT(nxt);
int ans = 0;
get_next(s2);
int i=0,j=0;
while(i<s1.length()&&j<s2.length())
{
if(s1[i]==s2[j]) {
i++,j++;
}else if(nxt[j]==-1) {
i++;
j=0;
}else {
j = nxt[j];
}
if(j==s2.length()) {
ans++;
j = 0;
}
}
return ans;
}
int main()
{
while(cin>>s1)
{
if(s1=="#") break;
cin>>s2;
int ans = kmp();
cout<<ans<<endl;
}
return 0;
}
kmpの実装-単純なアルゴリズム
おすすめ
転載: blog.csdn.net/qq_41563270/article/details/108362614
おすすめ
ランキング