洛谷 P3375 【模板】KMP字符串匹配

来源:互联网 发布:淘宝的产品介绍怎么写 编辑:程序博客网 时间:2024/05/21 22:59

题目描述

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

为了减少骗分的情况,接下来还要输出子串的前缀数组next。如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。

输入输出格式

输入格式:

第一行为一个字符串,即为s1(仅包含大写字母)

第二行为一个字符串,即为s2(仅包含大写字母)

输出格式:

若干行,每行包含一个整数,表示s2在s1中出现的位置

接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。

输入输出样例

输入样例#1:
ABABABCABA
输出样例#1:
130 0 1 

说明

时空限制:1000ms,128M

数据规模:

设s1长度为N,s2长度为M

对于30%的数据:N<=15,M<=5

对于70%的数据:N<=10000,M<=100

对于100%的数据:N<=1000000,M<=1000

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int n,m,nextval[1000+100];char s[1000000+100],t[1000+100];void getNextval(){    int i=0,j=-1;    nextval[0]=-1;    while(i<m){        if(j==-1||t[i]==t[j])        nextval[++i]=++j;        else j=nextval[j];    }}void KMP(){    int i=0,j=0;    while(i<n){        if(j==-1||s[i]==t[j]) ++i,++j;        else j=nextval[j];        if(j==m){            printf("%d\n",i-m+1);            j=nextval[j];        }    }}int main(){    scanf("%s%s",s,t);    n=strlen(s),m=strlen(t);    getNextval();    KMP();    for(int i=1;i<=m;i++)    printf("%d ",nextval[i]);    return 0;}


原创粉丝点击