您的位置:首页 > 其它

【模板】KMP字符串匹配

2017-11-07 16:42 239 查看

Description

如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置,并输出next数组

solution

kmp每一次打出来的都千奇百怪,以后就以今天打的为准了:

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long ll;
const int N=1000005;
int nxt
,n,m;
char a
,s
;
void work()
{
scanf("%s",a+1);
scanf("%s",s+1);
int p,n=strlen(a+1),m=strlen(s+1);
for(int i=2;i<=m;i++){
p=nxt[i-1];
while(p && s[p+1]!=s[i])p=nxt[p];
if(s[p+1]==s[i])nxt[i]=p+1;
}
p=0;
for(int i=1;i<=n;i++){
if(s[p+1]==a[i])p++;
else{
while(p && s[p+1]!=a[i])p=nxt[p];
if(s[p+1]==a[i])p++;
}
if(p==m)printf("%d\n",i-m+1);
}
for(int i=1;i<=m;i++)printf("%d ",nxt[i]);
}

int main()
{
work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: