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

来源:互联网 发布:淘宝账号申请 编辑:程序博客网 时间:2024/06/10 02:15

KMP字符串匹配

题目描述

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

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

输入输出格式

输入格式:
第一行为一个字符串,即为s1(仅包含大写字母)

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

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

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

分析:如题目,KMP模板。。。

代码

#include <cstdio>#include <cstring>#include <string>using namespace std;char s1[2000000],s2[200000];int p[2000000];int main(){    scanf("%s",s1);    scanf("%s",s2);    int n=strlen(s1);    int m=strlen(s2);    p[0]=-1;    int j=-1;    for (int i=1;i<m;i++)    {        while (j>-1&&s2[j+1]!=s2[i]) j=p[j];        if (s2[j+1]==s2[i]) j++;        p[i]=j;    }    j=-1;    for (int i=0;i<n;i++)    {        while (j>-1&&s2[j+1]!=s1[i]) j=p[j];        if (s2[j+1]==s1[i]) j++;        if (j==m-1)        {            printf("%d\n",i-m+2);            j=p[j];        }    }    for (int i=0;i<m;i++)        printf("%d ",p[i]+1);}
原创粉丝点击