题目
如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。
为了减少骗分的情况,接下来还要输出子串的前缀数组next。
(如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。)
题解
打个模板来贴上博客
代码
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
const int N=1000006;
char a[N],b[N],c[N];
int next[N],n,m,i,j;
int main(){
memset(c,'.',sizeof(c));
scanf("%s",&c);
for (i=0,m=-1;c[i]!='.';i++,m++)
b[i+1]=c[i];
memset(c,'.',sizeof(c));
scanf("%s",&c);
for (i=0,n=-1;c[i]!='.';i++,n++)
a[i+1]=c[i];
next[1]=0;
for (i=2,j=0;i<=n;i++){
while (j>0&&a[i]!=a[j+1]) j=next[j];
if (a[i]==a[j+1]) j++;
next[i]=j;
}
for (i=1,j=0;i<=m;i++){
while (j>0&&(j==n||b[i]!=a[j+1])) j=next[j];
if (b[i]==a[j+1]) j++;
if (j==n) printf("%d\n",i-j+1);
}
for (i=1;i<=n;i++)
printf("%d ",next[i]);
}