[KMP]一本通(http://ybt.ssoier.cn:8088) 1698:字符串匹配

字符串匹配

【题目描述】

对于一个字符集大小为C的字符串pp,可以将任意两个字符在p中的位置进行互换,例如p=12321,交换1212得到21312,交换14得到42324,交换可以进行任意次。若交换后p变成了字符串q,则成qp是匹配的。

给定两个字符集大小为C的字符串st,求出s中有多少个连续子串与t匹配。

【输入】

第一行两个整数TC,分别表示数据组数和字符集大小,字符用1C的整数来表示。

对于每组数据:第一行两个整数nm,分别表示st的长度。

第二行n个正整数表示s

第三行m个正整数表示t

【输出】

对于每组数据,输出包括两行:

第一行一个正整数k,表示s中有k个连续子串与t匹配。

第二行从小到大输出k个数,表示s中与t匹配的连续子串的首位下标(下标从1开始)。

【输入样例】

3 3

6 3

1 2 1 2 3 2

3 1 3

6 3

1 2 1 2 1 2

3 1 3

6 3

1 1 2 1 2 1

3 1 3

【输出样例】

3

1 2 4

4

1 2 3 4

3

2 3 4

【数据规模及约定】

对于10%的数据,满足n,m,C1000n,m,C1000

对于另外20%的数据,满足n,m105C40n,m105C40

对于另外30%的数据,满足n,m,C105n,m,C105

对于100%的数据,满足1n,m,C106T=31n,m,C106T=3

 

 

【分析】

这其实就是一道KMP的题

题目的难点在于如何交换字符

我们可以开一个数组l[1~c]

l[x]表示上一个x出现的位置

a[i]表示字符s[i]离上一个相同字符出现的距离

b[i]表示字符t[i]离上一个相同字符出现的距离

然后就是KMP

难点是如何判断s[i](t[i])的上一个相同字符是否在模式串之外

这其实很简单

直接判断上一个x出现的距离是否大于j不就行了

 

于是开两个函数

inline int jdg(int x,int l){return x<l?x:0;}//判断s[i](t[i])的上一个相同字符是否在匹配范围内//是就返回a[i](b[i]),否就返回0
inline bool eq(int x,int y,int l){return jdg(x,l)==jdg(y,l);}//判断是否匹配

 经历千辛万苦

 

 

【AC代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N (1000000+2)
#define C (1000000+2)
using namespace std;
int p[N];
int a[N],b[N];
int l[C];//这里很重要,我把C开小了交了不知多少次都没有过
int ans[N];
template<typename T>inline void read(T& x){char temp=getchar();bool u=0;for(x=0;temp<'0'||temp>'9';u=temp=='-',temp=getchar());for(;temp>='0'&&temp<='9';x=x*10+temp-'0',temp=getchar());if(u)x=-x;return ;
}//快读
inline int jdg(int x,int l){return x<l?x:0;}//判断s[i](t[i])是否在匹配范围内//是就返回a[i](b[i]),否就返回0
inline bool eq(int x,int y,int l){return jdg(x,l)==jdg(y,l);}//判断是否匹配
void work(){register int i,j,x;register int n,m;read(n);read(m);memset(a,0,sizeof a);memset(b,0,sizeof b);//有多组数据,一定要初始化memset(p,0,sizeof p);//否则就会成为某dengzhaoxing之二memset(l,0,sizeof l);for(i=1;i<=n;i++){read(x);a[i]=i-l[x];//将a[i]赋值为字符x与上一x之间的距离l[x]=i;}memset(l,0,sizeof l);//输入s和t之前都要初始化lfor(i=1;i<=m;i++){read(x);b[i]=i-l[x];//将b[i]赋值为字符x与上一x之间的距离l[x]=i;}for(i=1,j=0;i<m;i++){while(j&&!eq(b[i+1],b[j+1],j+1))j=p[j];if(eq(b[i+1],b[j+1],j+1))j++;p[i+1]=j;}//KMP初始化p数组for(x=i=j=0;i<n;i++){while(j&&!eq(a[i+1],b[j+1],j+1))j=p[j];if(eq(a[i+1],b[j+1],j+1))j++;if(j==m){ans[++x]=i+2-m;j=p[j];}}//KMP匹配printf("%d\n",x);for(i=1;i<=x;i++)printf("%d ",ans[i]);//输出答案putchar('\n');return ;
}
int main(){register int t,c,i;read(t);read(c);for(i=1;i<=t;i++)work();return 0;
}

  

  

 

  

转载于:https://www.cnblogs.com/TbIblog/p/11247312.html

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

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

相关文章

java后端面试笔记-自用

实习准备都准备什么&#xff1f; JAVA后端春招准备方向 面试视频 程序员面试一个Java实习生&#xff0c;展示教科书般回答&#xff0c;有两个大厂offer的他会来么&#xff1f; 迭代器 探讨迭代器中为什么不能通过集合的方式删元素而是使用迭代器中的remove()方法经行删除 反…

​两院院士评选“2021年中国/世界十大科技进展新闻”揭晓

来源&#xff1a;科学网由中国科学院、中国工程院主办&#xff0c;中国科学院学部工作局、中国工程院办公厅、中国科学报社承办&#xff0c;中国科学院院士和中国工程院院士投票评选的2021年中国十大科技进展新闻、世界十大科技进展新闻于2022年1月18日在京揭晓。此项年度评选活…

脑机综述(一) | 脑机接口在康复医学中的应用进展

来源&#xff1a;《中国康复医学》杂志 、臻泰智能论文《脑机接口在康复医学中的应用进展》琚芬&#xff11;&#xff0c;赵晨光&#xff11;&#xff0c;袁华&#xff11;&#xff0c;牟翔&#xff11;&#xff0c;王冰水&#xff12;【关键词】 脑机接口&#xff1b;运动功能…

SpringBoot-短信验证码-快速入门Demo(含redis)(手把手教你开通阿里云短信服务到写出个最终代码来)

B站小狂神-此博客的内容就是看了这个视频的总结&#xff08;博主自己写的哦~并非转载&#xff09; 视频链接-【狂神说】通俗易懂的阿里云短信业务实战教程&#xff08;露脸&#xff09; 您是否还在为别人的项目有短信功能自己的却没有&#xff1f; 您是否还在为自己的项目没有短…

Bresenham快速画直线算法

现在的计算机的图像的都是用像素表示的&#xff0c;无论是点、直线、圆或其他图形最终都会以点的形式显示。人们看到屏幕的直线只不过是模拟出来的&#xff0c;人眼不能分辨出来而已。那么计算机是如何画直线的呢&#xff0c;其实有比较多的算法&#xff0c;这里讲的是Bresenha…

国产光刻机正式宣布:今年出货150台

来源&#xff1a;世界先进制造技术论坛在芯片领域&#xff0c;有一个叫光刻机的设备&#xff0c;不是印钞机&#xff0c;但却比印钞机还金贵。全球只有荷兰一家叫做阿斯麦&#xff08;ASML&#xff09;的公司集全球高端制造业之大成&#xff0c;一年时间造出二十台高端设备&…

junit单元测试,反射,注解

今日内容 1. Junit单元测试 2. 反射 3. 注解Junit单元测试&#xff1a; * 测试分类&#xff1a;1. 黑盒测试&#xff1a;不需要写代码&#xff0c;给输入值&#xff0c;看程序是否能够输出期望的值。2. 白盒测试&#xff1a;需要写代码的。关注程序具体的执行流程。* Junit使…

OIS几个重要的类的使用

一 OIS的简介&#xff1a; OIS有很多的类&#xff0c;头文件也10多个&#xff0c;很多人一到就蒙了&#xff0c;其实不然&#xff0c;虽然头文件很多&#xff0c;但是都很简单。 #include "OIS.h" 包含了所有用到的头文件&#xff0c;使用OIS时&#xff0c…

元宇宙的“42条共识”

来源&#xff1a; 量子学派*以下内容、图片综合自《图说元宇宙》《设计元宇宙》系列01元宇宙不是一天建成的罗马不是一天建成的&#xff0c;元宇宙也一样。人类从未像今天这样&#xff0c;可以自己成为“创世主”。元宇宙融合了信息技术&#xff08;5G/6G&#xff09;、互联网时…

struts2被淘汰的原因

Struts2是一个基于MVC设计模式的Web应用框架&#xff0c;它本质上相当于一个Servlet。在MVC设计模式中&#xff0c;Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2是Struts的下一代产品&#xff0c;是在Struts1和WebWork的技术基础上进行了合并的全新的Str…

手把手教你用java读写excel表格文件(POI,EasyExcel)

视频链接-我是学习之星我为狂神打call~ 【狂神说Java】POI及EasyExcel一小时搞定通俗易懂 想给项目添加一个表格导入导出功能吗&#xff1f; “xxx管理系统”没有导入导出功能逼格不够了&#xff1f; 想简单入手下 how to 用java 生成excel又找不到合适的教程&#xff1f; com…

欢迎参加2022年第一次《城市大脑建设标准规范》专家研讨会

来源&#xff1a;世界数字大脑标准研究组2018年以来&#xff0c;城市大脑正成为智慧城市和智能产业的新热点&#xff0c;有近500个城市提出城市大脑的建设规划&#xff0c;数千家大中型科技企业进入城市大脑的建设领域。如何理清城市大脑的概念和定义&#xff0c;制定统一的城市…

面试问题

什么是闭包&#xff1f;1. 当一个内部函数被调用&#xff0c;就会形成闭包&#xff0c;闭包就是能够读取其他函数内部变量的函数定义&#xff1a;闭包是能够读取其他函数内部变量的函数&#xff0c;在js中&#xff0c;只有函数内部的子函数才能读取局部变量&#xff0c;所以闭包…

Spring常用注解的讲解

转载&#xff0c;原文链接 作者&#xff1a;字母哥博客 本文出自&#xff1a;springboot深入浅出系列 文章目录一、常用注解回顾1.1 RequestBody与ResponseBody1.2. RequestMapping注解1.3. RestController与Controller1.4. PathVariable 与RequestParam二、接收复杂嵌套对象参…

复杂系统与人工生命:十年研究概览

来源&#xff1a;集智俱乐部作者&#xff1a;Thomas McAtee、Claudia Szabo译者&#xff1a;陈翔 审校&#xff1a;刘培源编辑&#xff1a;邓一雪导语人工生命&#xff08;artificial life&#xff09;是通过仿真建模、机器技术和生物化学等方式模拟自然生命系统&#xff0c;进…

day22-面向对象之封装

# 封装 什么是封装? # 就是将复杂的丑陋的,隐私的细节隐藏到内部,对外提供简单的使用接口 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装? ​ # 两个目的 ​ 1.为了保证关键数据的安全性 ​ 2.对外部隐藏实现细节,隔离复杂度 什么时候应该封装? #​ 当有一些数据…

5.1传输层概述

5.1传输层概述 文章目录传输层概述传输层的两个协议传输层的寻址与端口传输层概述 传输层的两个协议 传输层的寻址与端口

多细胞生命进击之路:单细胞为何放弃自由,长成复杂的多细胞?

来源&#xff1a;集智俱乐部作者&#xff1a;Veronique Greenwood译者&#xff1a;赵雨亭审校&#xff1a;张澳编辑&#xff1a;邓一雪导语人类作为复杂的多细胞生命&#xff0c;似乎理所当然地认为&#xff0c;多细胞生命相对单细胞生命有绝对的优势。但实际上单细胞生命进化为…

5.2 UDP协议

5.2 UDP协议 文章目录用户数据报协议udp概述udp首部形式udp校验用户数据报协议udp概述 udp首部形式 udp校验

一个XML转换的例子

问&#xff1a; 我想把字符串转换成stream, 然后 System.Xml.XmlTextReader xmlReader new System.Xml.XmlTextReader(System.IO.Stream input) ______________________________________________________________________________________________ 答1&#xff1a; 为何一定要…