当前位置: 首页 > news >正文

题解:洛谷 P3375 【模板】KMP

【题目来源】

洛谷:P3375 【模板】KMP - 洛谷

【题目描述】

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

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

【输入】

第一行为一个字符串,即为 \(s_1\)
第二行为一个字符串,即为 \(s_2\)

【输出】

首先输出若干行,每行一个整数,按从小到大的顺序输出 \(s_2\)\(s_1\) 中出现的位置。
最后一行输出 \(∣s_2∣\) 个整数,第 \(i\) 个整数表示 \(s_2\) 的长度为 \(i\) 的前缀的最长 border 长度。

【输入样例】

ABABABC
ABA

【输出样例】

1
3
0 0 1 

【解题思路】

image

【算法标签】

《洛谷 P3375 KMP》 #字符串# #KMP# #O2优化#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 1000005;  // 定义最大字符串长度char s[N], p[N];  // s: 主串, p: 模式串
int nex[N];       // KMP算法中的next数组int main()
{// 输入主串和模式串(从下标1开始存储)cin >> s + 1;int n = strlen(s + 1);  // 主串长度cin >> p + 1;int m = strlen(p + 1);  // 模式串长度// 计算模式串的next数组nex[0] = nex[1] = 0;  // 初始化前两个位置for (int i = 2, j = 0; i <= m; i++){// 当不匹配时回退while (j && p[i] != p[j + 1]){j = nex[j];}// 匹配成功则j增加if (p[i] == p[j + 1]){j++;}nex[i] = j;  // 记录当前位置的next值}// 使用KMP算法进行模式匹配for (int i = 1, j = 0; i <= n; i++){// 当不匹配时利用next数组回退while (j && s[i] != p[j + 1]){j = nex[j];}// 匹配成功则j增加if (s[i] == p[j + 1]){j++;}// 完全匹配时输出起始位置if (j == m){cout << i - m + 1 << endl;}}// 输出next数组(调试用)for (int i = 1; i <= m; i++){cout << nex[i] << " ";}return 0;
}
// 使用acwing模板二刷
#include <bits/stdc++.h>
using namespace std;const int N = 1000005;  // 定义最大字符串长度int ne[N];              // KMP算法中的next数组
char p[N], s[N];        // p: 模式串, s: 主串(都从下标1开始存储)int main()
{// 输入主串和模式串(从下标1开始存储)cin >> s + 1;int m = strlen(s + 1);  // 主串长度cin >> p + 1;int n = strlen(p + 1);  // 模式串长度// 计算模式串的next数组for (int i = 2, j = 0; i <= n; i++){// 当不匹配时利用next数组回退while (j && p[i] != p[j + 1]){j = ne[j];}// 匹配成功则j增加if (p[i] == p[j + 1]){j++;}ne[i] = j;  // 记录当前位置的next值}// KMP算法匹配过程for (int i = 1, j = 0; i <= m; i++){// 当不匹配时利用next数组回退while (j && s[i] != p[j + 1]){j = ne[j];}// 匹配成功则j增加if (s[i] == p[j + 1]){j++;}// 完全匹配时输出起始位置if (j == n){cout << i - n + 1 << endl;}}// 输出next数组(调试用)for (int i = 1; i <= n; i++){cout << ne[i] << " ";}return 0;
}

【运行结果】

ABABABC
ABA
1
3
0 0 1
http://www.jsqmd.com/news/394346/

相关文章:

  • Nacos2.x 事件驱动架构:原理与实战 - 实践
  • DeepSeek总结的DuckDB爬虫(crawler)扩展
  • 2026年标牌生产厂家实力推荐:智工标牌有限公司,全品类标牌一站式供应 - 品牌推荐官
  • 使用Hexo搭建个人博客
  • 2026年探伤仪设备推荐:苏州德斯森电子法兰盘/进口/钢板/锅炉探伤仪全系解决方案 - 品牌推荐官
  • 基于改进A*算法的单agv路径规划算法仿真 可以更改地图,起始点,目标点 % 1 表示障碍物 ...
  • 2026年知名的汽车衡地磅,电子地磅厂家选型参考手册 - 品牌鉴赏师
  • 2026年百度广告推广开户竞价代运营公司/服务商测评榜单:深圳昊客网络 专业化引领 - 深圳昊客网络
  • 题解:洛谷 P1816 忠诚
  • ESP32开发工具链搭建-Blinker物联网开发
  • 演唱会利器
  • JavaScript闭包完全指南:从作用域链到实际应用
  • 走失儿童信息寻人平台PHP
  • 题解:洛谷 P1226 【模板】快速幂
  • 前端工程化实战:从零搭建一个企业级Monorepo项目
  • PHP抑郁症焦虑自测与交流平台
  • PHP英语课程学习资源分享博客
  • 题解:洛谷 P1966 [NOIP 2013 提高组] 火柴排队
  • 如何速成RAG+Agent框架大模型应用搭建?看完这一篇你就会了!!!
  • React Hooks进阶:从入门到精通,彻底掌握useEffect的完整指南
  • 2026年百度搜索广告推广开户竞价代运营公司/服务商测评榜单:这5家值得重点关注! - 深圳昊客网络
  • 2026-02-18 学习
  • 2026信誉好的口播文案智能体服务商哪家靠谱
  • 题解:洛谷 P1908 逆序对
  • 2026顶尖的口播文案智能体品牌公司排行
  • 支付宝消费券回收,闲券秒变零花钱 - 京顺回收
  • 2026上海展厅设计精选:口碑企业塑造独特品牌空间,展台搭建/会展/会场搭建/展位搭建/展览设计,展厅设计企业怎么选择 - 品牌推荐师
  • 沃尔玛购物卡交易平台大盘点:找到最快回收渠道! - 团团收购物卡回收
  • 完整教程:深度解析 Spring 框架核心代理组件 MethodProxy.java
  • 电赛九校联赛A题-信号测量笔记