洛谷 P3375 【模板】KMP

【洛谷】P4391 [BOI2009]Radio Transmission 无线传输 && P3375 【模板】KMP字符串匹配 首先来看洛谷的P4391,题目链接https://www.luogu.org/problemnew/show/P4391 想了几分钟我是没什么思路的,只想到了hash,但感觉不是正解(看题解还真的有人用hash做出来了orz),然后就打开题解了,发现这题解法的确妙,这也是写下这篇博客记录的原因。 本题算法思路需要有kmp算法基础才能看懂。 这里推荐与记录两篇好的博客和两期视频: ht... 阅读详情

【模板】KMP

题目描述

给出两个字符串 s 1 s_1 s1​ 和 s 2 s_2 s2​,若 s 1 s_1 s1​ 的区间 [ l , r ] [l, r] [l,r] 子串与 s 2 s_2 s2​ 完全相同,则称 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现了,其出现位置为 l l l。
现在请你求出 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中所有出现的位置。

定义一个字符串 s s s 的 border 为 s s s 的一个非 s s s 本身的子串 t t t,满足 t t t 既是 s s s 的前缀,又是 s s s 的后缀。
对于 s 2 s_2 s2​,你还需要求出对于其每个前缀 s ′ s' s′ 的最长 border t ′ t' t′ 的长度。

输入格式

第一行为一个字符串,即为 s 1 s_1 s1​。
第二行为一个字符串,即为 s 2 s_2 s2​。

输出格式

首先输出若干行,每行一个整数,按从小到大的顺序输出 s 2 s_2 s2​ 在 s 1 s_1 s1​ 中出现的位置。
最后一行输出 ∣ s 2 ∣ |s_2| ∣s2​∣ 个整数,第 i i i 个整数表示 s 2 s_2 s2​ 的长度为 i i i 的前缀的最长 border 长度。

样例 #1

样例输入 #1

ABABABC
ABA

样例输出 #1

1
3
0 0 1

数据规模与约定

本题采用多测试点捆绑测试,共有 3 个子任务。

  • Subtask 1(30 points): ∣ s 1 ∣ ≤ 15 |s_1| \leq 15 ∣s1​∣≤15, ∣ s 2 ∣ ≤ 5 |s_2| \leq 5 ∣s2​∣≤5。
  • Subtask 2(40 points): ∣ s 1 ∣ ≤ 1 0 4 |s_1| \leq 10^4 ∣s1​∣≤104, ∣ s 2 ∣ ≤ 1 0 2 |s_2| \leq 10^2 ∣s2​∣≤102。
  • Subtask 3(30 points):无特殊约定。

对于全部的测试点,保证 1 ≤ ∣ s 1 ∣ , ∣ s 2 ∣ ≤ 1 0 6 1 \leq |s_1|,|s_2| \leq 10^6 1≤∣s1​∣,∣s2​∣≤106, s 1 , s 2 s_1, s_2 s1​,s2​ 中均只含大写英文字母。

原题

洛谷P3375——传送门

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MAX = 1e6 + 6;
int Next[MAX];
vector<int> ans;
inline void GetNext(string s, int l) // 获得字符串s的Next数组
{
    int t;
    Next[0] = -1;               // 如果在0位置失配则是向下移动一位
    for (int i = 1; i < l; ++i) // 依次求解后面的Next数组
    {
        t = Next[i - 1];
        while (s[t + 1] != s[i] && t >= 0)
            t = Next[t];
        if (s[t + 1] == s[i])
            Next[i] = t + 1;
        else
            Next[i] = -1;
    }
}
inline void KMP(string s1, int l1, string s2, int l2)
{
    GetNext(s2, l2);
    int i = 0, j = 0;
    while (j < l1)
    {
        if (s2[i] == s1[j]) // 当前位匹配成功,继续匹配下一位
        {
            ++i;
            ++j;
            if (i == l2) // 完全匹配
            {
                ans.push_back(j - l2 + 1); // 储存答案
                i = Next[i - 1] + 1;       // 继续匹配
            }
        }
        else
        {
            if (i == 0) // 在首位不匹配
                j++;
            else
                i = Next[i - 1] + 1;
        }
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    string s1, s2;
    cin >> s1 >> s2;
    int l1 = s1.size();
    int l2 = s2.size();
    KMP(s1, l1, s2, l2);
    for (int i = 0; i < ans.size(); i++)
    {
        cout << ans[i] << '\n';
    }
    for (int i = 0; i < l2; i++)
    {
        cout << Next[i] + 1 << ' ';
    }

    return 0;
}
题解:洛谷 P3375 【模板】KMP 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。的前缀的最长 border 长度。,你还需要求出对于其每个前缀。首先输出若干行,每行一个整数,中出现了,其出现位置为。第一行为一个字符串,即为。第二行为一个字符串,即为。的 border 为。的最长 border。本文分享的必刷题目是从。#普及+# #KMP# 阅读详情

相关推荐

CDO批量处理nc文件:5分钟搞定CMIP6数据双线性插值(附完整代码)

本文详细介绍了如何使用CDO工具链中的`remapbil`命令,快速实现CMIP6数据的批量双线性插值处理。通过环境配置、核心操作步骤、高级优化技巧及典型报错解决方案,帮助科研人员高效处理大规模nc文件,显著提升气象数据处理效率。

weixin_29267307的博客 292

洛谷.P3375-KMP字符串匹配

原题连接 P3375-KMP字符串匹配 题解代码如下 #include<bits/stdc++.h> using namespace std; const int N = 1e6 + 7; char s1[N],s2[N]; int ne[N]; int main(){ scanf("%s%s",s1+1,s2+1); int n = strlen(s1+1);///字符串 int m = strlen(s2+1);///模式串 for(in

weixin_43211195的博客 315

rk3399 linux 5.10 usb 2.0设备上电概率性注册失败

先排除硬件上的问题,然后就烧录kernel 4.1的的镜像,多次测试也没有发现这个问题,所以排除了硬件上的问题,然后。查下usb hub和usb 4G的复位脚,写驱动都给它们配上了,但是还是存在这个问题。最后通过对比rk3399.dtsi发现少了个power-domains = ;多次开关机,发现usb hub和4G都通信失败了,这就有点奇怪了,按理说usb驱动是没啥问题的。加上后,重新编译烧录,重新测试没有发现这个问题了!先查看usb log。

qq_32017483的博客 2673

【洛谷 P3375】【模板】KMP 题解(字符串+KMP算法)

给出两个字符串s1​和s2​,若s1​的区间lr子串与s2​完全相同,则称s2​在s1​中出现了,其出现位置为l。现在请你求出s2​在s1​中所有出现的位置。定义一个字符串s的 border 为s的一个s的子串t,满足t既是s的前缀,又是s的后缀。对于s2​,你还需要求出对于其每个前缀s′的最长 bordert′的长度。

HEX9CF的技术博客 1279

[LaTeX] 使用natbib宏包实现参考文献的“作者-年份”引用格式及常见编译错误排查

本文详细介绍了在LaTeX中使用natbib宏包实现参考文献“作者-年份”引用格式的完整流程。从宏包配置、.bib文件准备到标准编译步骤,重点解析了常见的“Bibliography not compatible with author-year”错误成因,并提供了彻底清理辅助文件等解决方案,帮助用户高效排版符合学术规范的参考文献。

moon9的博客 481

别再瞎改注册表了!实测Win10/Win11远程桌面60帧的正确姿势(附ToDesk对比)

本文深入解析Windows远程桌面60帧优化的科学方法,揭示常见误区并提供实测有效的解决方案。从版本差异到硬件加速,再到第三方工具对比(如ToDesk),帮助用户避开无效的注册表修改,实现流畅的远程桌面体验。

weixin_33738555的博客 342

算法刷题【洛谷P3375】【模板】KMP字符串匹配(KMP算法模板 超详细易懂讲解)

给出两个字符串 s_1s 1 ​ 和 s_2s 2 ​ ,若 s_1s 1 ​ 的区间 [l, r][l,r] 子串与 s_2s 2 ​ 完全相同,则称 s_2s 2 ​ 在 s_1s 1 ​ 中出现了,其出现位置为 ll。 现在请你求出 s_2s 2 ​ 在 s_1s 1 ​ 中所有出现的位置。 定义一个字符串 ss 的 border 为 ss 的一个非 ss 本身的子串 tt,满足 tt 既是 ss 的前缀,又是 ss 的后缀。 对于 s_2s 2 ​

异想之旅的博客 1106

实战:如何通过修改VTS和HTS调整GC4653 sensor帧率(附完整计算步骤)

本文以GC4653图像传感器为例,详细解析了通过修改VTS和HTS寄存器来精确调整输出帧率的完整流程。文章深入剖析了帧率计算公式FPS = PCLK / (VTS × HTS)的核心原理,并提供了从获取寄存器参数、计算目标VTS值到系统验证的实战步骤,帮助工程师掌握独立优化Sensor性能、提升低照度画质的关键技能。

gin88的博客 338

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

值得一提的是,整段代码我改了四五遍,从next数组的获取到kmp字符串匹配,在洛谷oj一直是0,直到在b站搜到个视频,才发现cin输出可行,原先一直是getline(),因为getline()能舍弃输入流中的换行符,结果就是这个大问题导致一直报错,看来还是不能盲目相信自己的直觉啊,cin输入字符串,真记住了。//求这个公共最长子序列,本质上还是字符串匹配的,并且这个匹配还就得用到现求的next数组的值。//这个next数组,实际上求了就要用的。//还是用循环把,递归用这不太顺手。//开始kmp算法匹配。

aiwangyi6的博客 335

《Unity DOTS之ECS从入门到不香》(1)基本概念

文章目录一、什么是DOTS?二、什么是ECS?三、Hello World 一、什么是DOTS? Data Oriented Tech Stack(DOTS)是unity推出的多线程面向数据的技术堆栈 。它是一套高性能解决方案,包含三个部分: 1.ECS:ECS是一种有别于面向对象的编程模式,是面向CPU Cache友好的编程模式。要求代码都要按照 实体+组件+系统 的框架构建。官方链接 2.JobSystem:JobSystem是unity推出的一套先进的多线程任务管理系统,结合ECS可以获得最佳性能。当然

Cxihu田树东的游戏开发博客 2732

基于 STM32 的手持式安检金属探测器设计与实现

【代码】基于 STM32 的手持式安检金属探测器设计与实现。

weixin_42300449的博客 899

【数据结构】【洛谷】P3375模板题 KMP

主要还是KMP算法,上学期没学,只是考前抱了抱佛脚,也没怎么弄明白. 先放代码: //KMP #include <bits/stdc++.h>//万能头 using namespace std; string s,t;//s文本串,t模式串 //用char数组比较符合习惯,但是想试试string类 int nxt[100002];//在全局变量区,一般这个数组会初始化为全0 //getNext函数实际上就是让t自己与自己进行一个匹配. void getNext(string& t)/.

daixd5520的博客 683

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

【Proteus仿真】用24C04与1602LCD设计的简易加密电子密码锁

perseverance51博客 1121

洛谷P3375 【模板】KMP

P3375 【模板】KMP - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

ByteMaster_的博客 2351

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。 为了减少骗分的情况,接下来还要输出子串的前缀数组next。 输入输出格式 输入格式: 第一行为一个字符串,即为s1 第二行为一个字符串,即为s2 输出格式: 若干行,每行包含一个整数,表示s2在s1中出现的位置 接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。 输入输出样例...

邮差将军的博客 258

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

洛谷 P3375 【模板】KMP 题解

KMP算法是一种高效的字符串匹配算法,核心思想是利用前缀函数避免不必要的回溯。前缀函数π[i]记录模式串T[1...i]的最长相等真前后缀长度。算法分为两步:1)预处理模式串计算π数组;2)在主串S中匹配T,失配时利用π数组调整位置而不回溯主串指针。时间复杂度为O(n+m),空间复杂度O(m)。洛谷模板题P3375给出了完整实现代码,包括π数组计算和匹配过程,最终输出所有匹配位置和π数组值。

2503_92897658的博客 1024

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

洛谷 P3375 【模板】KMP字符串匹配 输入格式 第一行为一个字符串,即为 s1。 第二行为一个字符串,即为 s2。 输出格式 首先输出若干行,每行一个整数,按从小到大的顺序输出 s2在 s1中出现的位置。 最后一行输出 |s2| 个整数,第 i 个整数表示 s2的长度为 i 的前缀的最长 border 长度。 输入输出样例 输入 ABABABC ABA 输出 1 3 0 0 1 AC代码: #include <iostream> #include <cstdio> #inclu

weixin_46283740的博客 272

洛谷-P3375 【模板】KMP

给出两个字符串 s1​ 和 s2​,若 s1​ 的区间 [l,r] 子串与 s2​ 完全相同,则称 s2​ 在 s1​ 中出现了,其出现位置为 l。这里string字符串输入只能用cin,不要用getline,具体我也不知道为什么有知道欢迎在评论区中解答!最后一行输出 ∣s2​∣ 个整数,第 i 个整数表示 s2​ 的长度为 i 的前缀的最长 border 长度。对于全部的测试点,保证 1≤∣s1​∣,∣s2​∣≤106,s1​,s2​ 中均只含大写英文字母。输出 s2​ 在 s1​ 中出现的位置。

2301_81651554的博客 625

推荐题目:洛谷 P3375 【模板】KMP

洛谷 P3375 题目要求实现 KMP 算法,解决字符串匹配问题。给定两个字符串 s1 和 s2,需要找出 s2 在 s1 中的所有出现位置,并输出每个位置的起始索引。同时,要求计算 s2 每个前缀的最长 border 长度(即既是前缀又是后缀的最长子串长度)。题目采用多测试点捆绑测试,数据规模可达 10^6 字符,保证输入仅含大写字母。示例输入 "ABABABC" 和 "ABA" 的输出结果为位置 1、3 和 border 长度 [0, 0, 1]。

C++ 狂魔!!!偶尔会写 C 语音!!! 695
上一篇: 洛谷 P1111 修复公路 题解 并查集
下一篇: Codeforces Round 943 (Div. 3) G1. Division + LCP (easy version) 二分+KMP
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值