洛谷 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# 阅读详情

相关推荐

得利捷datalogic扫码枪调试说明

针对得利捷datalogic扫码枪快速调试并,可以根据详细步骤设置扫码枪,并配有tcp调试助手辅以验证,以达到快速调试完成扫码枪的工作。

Conway510的博客 1万+

洛谷.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

Win11 24H2共享访问被禁?深入聊聊SMB签名和‘不安全的来宾登录’那点事

本文深入解析Win11 24H2共享访问故障,探讨SMB签名的安全机制与‘不安全的来宾登录’问题。提供从注册表修改到组策略配置的多层次解决方案,特别针对家庭网络和打印机共享场景给出实用建议,帮助用户在安全与便利之间找到平衡。

weixin_42556197的博客 565

【洛谷 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

利用Arcgis提取nc数据并计算区域年均温

1.下载数据。2.解压数据至不含中文的路径中。打开工具箱中的多维分析工具-创建NetCDF栅格图层,导入数据。3.打开工具箱中的数据管理工具-图层和表视图-创建栅格图层,导入数据,对输出数据进行命名,得到月均温栅格数据。4.选择工具箱-Spatial Analyst工具(空间分析工具)-地图代数-栅格计算器,计算全国一年年均温。​5.将其导出为.tif格式数据,方便后期使用。6.选择工具箱-Spatial Analyst工具(空间分析工具)-区域分析--以表格显示分区统计,得到分区域的气温数据。

什么都学亿点点的博客 7992

2023-07-04 Fast-Lio论文中公式(6)与BCH公式中近似雅可比公式的一致性推导

将(1)式代入(6)式,就有。

wmorries的博客 476

算法刷题【洛谷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

别再乱短接了!OEC/OEC-turbo刷机救砖,用RKDevTool避开‘下载boot失败’的保姆级教程

本文提供OEC/OEC-turbo刷机救砖的终极指南,重点介绍使用RKDevTool避开‘下载boot失败’的详细步骤。从Loader模式的优势到硬件准备细节,再到分阶段刷机方案,帮助用户高效完成设备恢复,避免反复短接和常见误区。

weixin_29280657的博客 1102

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

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

aiwangyi6的博客 335

RepHead一种重参数化检测头用于提升YOLOv8在困难样本上的检测性能

在目标检测任务中,困难样本通常是指那些由于特殊背景、遮挡、低分辨率或极度小物体等因素,导致模型难以识别的样本。这类样本对传统YOLO系列模型的影响较大,常常造成漏检或误检。重参数化(Reparameterization)是一种深度学习中常用的技术,旨在通过对网络参数的变换,使得模型在训练过程中能够更加灵活地适应不同的数据特征。通过对原始网络结构的参数进行重新表达,能够引导模型在训练过程中学习到更加有效的特征。本文详细介绍了YOLOv8的改进——RepHead检测头,并深入分析了它在解决困难样本检测中的应用。

博客 1209

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 869

【数据结构】【洛谷】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

一个中科大差生的8年程序员工作总结

今年终于从大菊花厂离职了,离职前收入大概60w不到吧,在某乎属于比较差的,今天终于有空写一下自己的职场故事,也算是给自己近8年的程序员工作做个总结复盘。近8年有些事情做对了,也有更多事情做错了,在这里记录一下,希望能够给后人一些帮助吧,也欢迎私信交流。文笔不好,见谅,有些细节记不清了,如果有出入,就当是我编的这个故事吧。 PS:有几个问题先在这里解释一下,评论就不一一回复了 1、关于差生,我本人在科大时确实成绩偏下,差生主要讲这一点,没其他意思。 2、因为买房是我人生中的大事,我认为需要记录和总结一下

陈小房的自我修炼 5万+

洛谷P3375 【模板】KMP

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

ByteMaster_的博客 2351

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

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

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

邮差将军的博客 258

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

洛谷 P3375 【模板】KMP 题解

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

2503_92897658的博客 1024

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

洛谷 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、付费专栏及课程。

余额充值