zoukankan      html  css  js  c++  java
  • [洛谷P3375] 【模板】KMP字符串匹配

    题目描述

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

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

    输入输出格式

    输入格式:

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

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

    输出格式:

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

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

    输入输出样例

    输入样例#1:
    ABABABC
    ABA
    输出样例#1:
    1
    3
    0 0 1 
    

    说明

    时空限制:1000ms,128M

    数据规模:

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

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

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

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

    样例说明:

    所以两个匹配位置为1和3,输出1、3

    思路

    KMP算法;

    学习学习↓

    http://www.matrix67.com/blog/archives/115

    代码实现

     1 #include<cstdio>
     2 #include<cstring>
     3 const int maxn=1e6+10;
     4 int p[maxn],la,lb;
     5 char a[maxn],b[maxn];
     6 int main(){
     7     scanf("%s%s",a,b);
     8     la=strlen(a),lb=strlen(b),p[0]=-1;
     9     for(int i=1,j=-1;i<lb;i++){
    10         while(j>-1&&b[j+1]!=b[i]) j=p[j];
    11         if(b[j+1]==b[i]) j++;
    12         p[i]=j;
    13     }
    14     for(int i=0,j=-1;i<=la;i++){
    15         while(j>-1&&b[j+1]!=a[i]) j=p[j];
    16         if(b[j+1]==a[i]) j++;
    17         if(j==lb-1) printf("%d
    ",i-lb+2);
    18     }
    19     for(int i=0;i<lb;i++) printf("%d ",p[i]+1);
    20     return 0;
    21 }
  • 相关阅读:
    安全
    请求
    使用 Fetch
    安全
    script
    PWA
    link(外部资源关系)
    base(根URL)
    缓存
    IndexedDB基本概念
  • 原文地址:https://www.cnblogs.com/J-william/p/7077772.html
Copyright © 2011-2022 走看看