#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAXN = 1000000 + 50;
char s1[MAXN],s2[MAXN];
int next[MAXN];
int n,m,ans;
int main(){
scanf("%s",s1 + 1);
scanf("%s",s2 + 1);
n = strlen(s1 + 1);
m = strlen(s2 + 1);
for(int i = 2;i <= n;i ++){
int p = next[i - 1];
while(p && s1[p + 1] != s1[i])//失配,寻找最长前缀
p = next[p];
if(s1[p + 1] == s1[i])//
p ++;
next[i] = p;
}
int p = 0;
for(int i = 1;i <= m;i ++){
while(p && s1[p + 1] != s2[i])
p = next[p];
if(s1[p + 1] == s2[i])
p ++;
if(p == n)
ans ++;
}
printf("%d",ans);
return 0;
}
[模板]kmp[poj3461][codevs5757]
最新推荐文章于 2019-08-08 14:28:51 发布
本文介绍了一种高效的字符串匹配算法实现,通过构建next数组来加速模式串s1在目标串s2中的查找过程,详细展示了算法的核心步骤及其实现细节。

2422

被折叠的 条评论
为什么被折叠?



