P3375 【模板】KMP

news/2025/3/21 22:25:55/文章来源:https://www.cnblogs.com/gxjcnblogs/p/18785941

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 长度。

输入输出样例 #1

输入 #1

ABABABC
ABA

输出 #1

1
3
0 0 1

说明/提示

样例 1 解释

对于 \(s_2\) 长度为 \(3\) 的前缀 ABA,字符串 A 既是其后缀也是其前缀,且是最长的,因此最长 border 长度为 \(1\)

数据规模与约定

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

  • Subtask 1(30 points):\(|s_1| \leq 15\)\(|s_2| \leq 5\)
  • Subtask 2(40 points):\(|s_1| \leq 10^4\)\(|s_2| \leq 10^2\)
  • Subtask 3(30 points):无特殊约定。

对于全部的测试点,保证 \(1 \leq |s_1|,|s_2| \leq 10^6\)\(s_1, s_2\) 中均只含大写英文字母。
也算是把kmp的算法代码背下来了

#include<iostream>
#include<string>
const int N=1e6+5;
int next[N];
int main(){std::cin.tie(0);std::cout.tie(0);std::string S,P;std::cin>>S>>P;int n=S.size();int m=P.size();S=" "+S;P=" "+P;next[1]=0;for(int i=2,j=0;i<=m;i++){while(j&&P[i]!=P[j+1])j=next[j];if(P[i]==P[j+1])j++;next[i]=j;}for(int i=1,j=0;i<=n;i++){while(j&&S[i]!=P[j+1])j=next[j];if(S[i]==P[j+1])j++;if(j==m){std::cout<<i-m+1<<std::endl;}}for(int i=1;i<=m;i++)std::cout<<next[i]<<" ";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902680.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cursor 使用教程

目录核心功能TabAICHATCOMPOSER@DocsWebGitNotepadCodebase技巧和思路如果Cursor乱改代码怎么办? 核心功能 Tab 这个是Cursor最为强大的功能,使用也很简单,在编写代码的时候,如果出现了灰色的提示词,直接按Tab就可以自动补全了最后的灰色的就是提示词 Cursor的光标预测也很…

C语言学习打卡第二天(2025.3.21)

时间有点少,今天也没学多少,只把指针基础概念学了一下(例如指针变量,下标法等),题也只做了三道。

3.21 学习记录

设计科技查询手机端系统,实现了政策关键字进行模糊匹配查询,点击下方的政策名称,可以打开新窗口,显示政策全文,实现分页查询,分类查询 采用springboot+vue3实现

P8436 【模板】边双连通分量

P8436 【模板】边双连通分量 题目描述 对于一个 \(n\) 个节点 \(m\) 条无向边的图,请输出其边双连通分量的个数,并且输出每个边双连通分量。 输入格式 第一行,两个整数 \(n\) 和 \(m\)。 接下来 \(m\) 行,每行两个整数 \(u, v\),表示一条无向边。 不保证图为简单图,图中可…

SvelteKit 最新中文文档教程(8)—— 部署 Node 服务端

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

第四篇:本地私有化部署大模型(Ollama、vLLM、LMDeploy)

魔塔社区平台介绍 量化:将高精度数值转换成低精度表示的过程(通常用于减少模型的内存和提高推理速度) Ollama部署大模型 linux安装miniconda# 下载 Miniconda 安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 运行安装脚本 bash…

用Adobe Illustrator编辑ArcGIS地图的方法

本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软件中进一步编辑地图,并最终导出为图片格式的结果文件的方法~本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软…

协议版iM蓝号检测,批量筛选iMessages数据,无痕检测是否开启iMessage服务

一、实现iMessage数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2…

记录项目调用链路

记录项目调用链路 内容 要理清项目中执行链路的调用关系,可以通过以下工具分类实现,涵盖从代码静态分析到运行时动态追踪的全链路管理:一、代码层调用关系分析 1. 静态代码分析工具PyCallGraph(Python) 生成代码调用关系图,直观展示函数调用链路。 pip install pycallgra…

部署kibana

获取kibana安装包 [root@elk1 ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.28-amd64.deb[root@elk1 ~]# ls kibana-7.17.28-amd64.deb kibana-7.17.28-amd64.deb# 安装kibana [root@elk1 ~]# dpkg -i kibana-7.17.28-amd64.deb 配置kibana [root@elk…

多线程程序设计(四)——Balking

本文摘要了《Java多线程设计模式》一书中提及的 Balking 模式的适用场景,并针对书中例子(若干名称有微调)给出一份 C++ 参考实现及其 UML 逻辑图,也列出与之相关的模式。 ◆ 适用场景 当线程访问的共享数据没有准备好时,就放弃后续的操作。 ◆ 解决方案 在临界区中判断共享…

A preLaunchTaskC/C++:g++.exe 生成活动文件已终止,退出代码为1。找到一个有点呆的bug

之前突然弹出这个问题,百思不得其解,今天突然发现,因为之前顺便命名了一个c++文件用来暂时装代码的,名字叫做a.cpp,编译器编译的过程中会生成一个可执行文件叫做a.exe,就冲突了,太傻了:-(