P3375 【模板】KMP字符串匹配

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: P3375 【模板】KMP字符串匹配

题目描述



给出两个字符串s1 和 s2,若 s1 的区间  [l,r] 子串与  s2 完全相同,则称  s2 在 s1 中出现了,其出现位置为  l。


现在请你求出 s2 在  s1 中所有出现的位置。


定义一个字符串 s  的 border 为 s  的一个非 s  本身的子串 t ,满足 t 既是 s  的前缀,又是  s 的后缀。


对于  s2,你还需要求出对于其每个前缀 s  的最长 border t 的长度。


输入格式



第一行为一个字符串,即为  s1。

第二行为一个字符串,即为 s2。


输出格式



首先输出若干行,每行一个整数,按从小到大的顺序输出  s2 在  s1 中出现的位置。

最后一行输出 ∣s2∣ 个整数,第  i 个整数表示 s2 的长度为 i 的前缀的最长 border 长度。


输入输出样例



输入  

ABABABC

ABA


输出  

1

3

0 0 1


题意分析就是让我们先找出第二的前后缀最长的公共子串,然后输出,最后利用这个找到第二个字符串在第一个字符串里面的位置,输出即可,kmp,这种思想要理解。具体思想看代码。


#include<bits/stdc++.h>
const int MAXN=1e7+10;
using namespace std;
int kmp[MAXN];
int la,lb,j; 
char a[MAXN],b[MAXN];
int main()
{
    cin>>a+1;//输入字符串s1 意思就是从下标1 
    cin>>b+1;//输入字符串s2 
    la=strlen(a+1);//长度相当于有几个字母注意 
    lb=strlen(b+1);
    for (int i=2;i<=lb;i++)//j控制kmp[j] 要小 
     {     
     while(j&&b[j+1]!=b[i])//j不为0且如果不相邻就跳到前一个前缀里面把j 
        j=kmp[j];    
       if(b[j+1]==b[i])//如果相等 
     j++;    
        kmp[i]=j;//前缀数 
       }
    j=0;
    for(int i=1;i<=la;i++)
     {
          while(j>0&&b[j+1]!=a[i])
           j=kmp[j];
          if (b[j+1]==a[i]) 
           j++;
          if (j==lb)
       {
      cout<<i-lb+1<<endl;
       j=kmp[j];//回溯把kmp的前缀拿出来 
       }
       }
    for (int i=1;i<=lb;i++)
    cout<<kmp[i]<<" ";//打印的是每个数的前缀 
}


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
5月前
|
算法 测试技术 C#
【动态规划】【字符串】C++算法:正则表达式匹配
【动态规划】【字符串】C++算法:正则表达式匹配
|
5月前
|
算法 C++ 索引
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
leetcode-28:实现 strStr()(字符串匹配,暴力匹配算法和KMP算法)
75 0
|
3月前
|
算法 Java
KMP算法详解及其在字符串匹配中的应用
KMP算法详解及其在字符串匹配中的应用
|
算法 Python
字符串匹配 - KMP算法
字符串匹配 - KMP算法
62 0
|
算法
KMP模板
KMP模板
|
存储 算法 C语言
KMP 字符串匹配算法
✅<1>主页:C语言的前男友 📃<2>知识讲解:KMP算法 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 🏡<5>系统环境:Windows 10 💬<6>前言:KMP 算法是一个非常牛逼的字符串匹配算法
|
算法
kmp算法模板
临近期末了,要开始复习了,先复习一下数据结构的kmp算法吧
|
算法
字符串匹配——kmp算法
字符串匹配——kmp算法
|
算法 C++
C++ 实现KMP字符串匹配算法
C++ 实现KMP字符串匹配算法
|
算法 Java
KMP字符串匹配算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。
128 0
KMP字符串匹配算法