P5256 [JSOI2013] 编程作业 个人题解

news/2025/11/19 10:45:21/文章来源:https://www.cnblogs.com/bdxzay10180615/p/19241348
说句闲话:题解管理员大大的审核速度天下第一

题目链接

题目大意:

给定两个字符串,要求第二个字符串在第一个字符串内类似的出现过多少次

Solution:

这道题是字符串查找的强化版,其实搞懂了那道题这道题就很简单了。

我们首先来看什么情况下两个字符串类似,其实要满足三个条件:

  1. 两个字符串 \(s1,s2\) 长度相等。
  2. \(s1_{i}\) 为大写字母时,\(s2_{i}\) 也必须为相同的大写字母。
  3. \(s1_{i}=s1_{j}\) 且这两个均为小写字母时必须保证 \(s2_{i}=s2{j}\) 同时也得是小写字母(不过不一定需要相等)。

前两个条件好办,第三个条件就有些许困难了,我们发现其与小写字母是什么无关,而是与小写字母之间的位置关系有关,当位置关系一致时就可以匹配上,那么怎么求位置关系呢,我们用两个数组来处理,一个 \(pre\) 数组来表示上一个相同的字符出现的位置,一个 \(a\) 数组来表示现在这一个字符到上一个相同字符的距离,然后我们就把问题转变为用 \(s2\)\(a\) 数组去匹配 \(s1\)\(a\) 数组能匹配上多少次。但是同那道题一样,如果把第一次出现的数字的 \(a\) 数组设置为 \(0\),就会导致匹配不上,最简单解决这类问题的方法是可以为它们设置一个通配符,即什么也可以匹配的上,在这里我用其第一次出现的位置作为其通配符(其实也可以用设置成 \(-1\) 来处理)。

然后我们看大写字母,这是与那道题不一样的地方,因为如果我们直接存大写字母进去的话会影响 \(a\) 数组,导致小写字母匹配时出错,不过我们可以把大写字母赋成负值,这样在处理时就不会出问题了(原因在下面)

然后变成的这个问题就需要用到 KMP 算法(不懂得可以看看这篇题解的前半段)了,一个用于处理一个字符串在另一个字符串内出现的次数。不过在比较是否相等时要注意不能与通配符比较是否相等,其实只需要比较当前的 \(a\) 数组是否大于当前匹配的长度,我们可以写一个 compare 函数来比较:

inline bool compare(int a,int b,int len){return (a==b) || (a>len && b>len);
}

那么为什么把大写字母设为负值就不会出问题呢,我们发现大写字母不会与小写字母去比较,且不会进入判断是否有通配符的语句,它只是在跑普通的 KMP 罢了,所以通过赋负值的方法我们解决了大小写区分的问题了。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
inline int read(){int x=0,f=1;char c=getchar();while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int Q=read(),nxt[N],pre[N],aa[N],bb[N];
char a[N],b[N];
inline bool compare(int a,int b,int len){//比较是否相等同时判断有无通配符 return (a==b) || (a>len && b>len);
}
int main(){while(Q--){int ans=0;scanf("%s%s",a+1,b+1);int n=strlen(a+1);int m=strlen(b+1);memset(pre,0,sizeof(pre));for(int i=1;i<=n;i++){if(a[i]>='A' && a[i]<='Z')//如果是大写字母直接赋负值 aa[i]=-(a[i]-'A'+1);else{aa[i]=i-pre[a[i]-'a'+1];pre[a[i]-'a'+1]=i;}}memset(pre,0,sizeof(pre));for(int i=1;i<=m;i++){if(b[i]>='A' && b[i]<='Z')bb[i]=-(b[i]-'A'+1);else{bb[i]=i-pre[b[i]-'a'+1];pre[b[i]-'a'+1]=i;}}nxt[1]=0;for(int i=2,j=0;i<=m;i++){while(j>0 && !compare(bb[j+1],bb[i],j))j=nxt[j];if(compare(bb[j+1],bb[i],j))j++;nxt[i]=j;}for(int i=1,j=0;i<=n;i++){while(j>0 && !compare(bb[j+1],aa[i],j))j=nxt[j];if(compare(bb[j+1],aa[i],j))j++;if(j==m){ans++;j=nxt[j];}}printf("%d\n",ans);}return 0;
}

再说一句,这道题有加强版,可以当作双倍经验做做。

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

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

相关文章

2025年热门的垃圾站用户信赖度权威榜

2025年热门的垃圾站用户信赖度权威榜行业背景与市场趋势随着城市化进程加速和环保政策趋严,垃圾处理设备行业迎来了前所未有的发展机遇。据中国环境保护产业协会最新数据显示,2024年我国垃圾处理设备市场规模已达580…

2025年11月低空感知平台解决方案商推荐排行:中立评估与实用建议

随着低空经济的快速发展,低空感知平台作为支撑无人机应用与低空管理的核心技术载体,正日益受到各行业用户的重视。2025年,在政策支持与技术迭代的双重驱动下,低空感知平台市场呈现快速扩张态势,用户群体涵盖政府部…

2025年质量好的昆明泡沫包装箱行业内知名厂家排行榜

2025年质量好的昆明泡沫包装箱行业内知名厂家排行榜 行业背景与市场趋势 泡沫包装箱作为现代物流、冷链运输及农产品保鲜的重要包装材料,市场需求持续增长。据《2024年中国包装行业市场分析报告》显示,全国泡沫包装…

【第4章 面向对象】Python 的 GC(垃圾回收)机制与触发时机

Python 的 GC(垃圾回收)核心是「引用计数 + 标记-清除 + 分代回收」机制,回收时机分「自动触发」和「手动触发」,不同机制的触发时机不同,核心原则是「不影响程序运行效率,同时及时回收无用资源」: 一、核心回收…

掌握数据手册:阅读数据手册综合指南

掌握数据手册:阅读数据手册综合指南参考:https://www.circuitbread.com/tutorials/mastering-datasheets-a-comprehensive-guide-on-how-to-read-datasheets掌握数据手册:阅读数据手册综合指南 简介在电子和嵌入式系…

MATLAB自适应子空间辨识工具箱

MATLAB自适应子空间辨识工具箱,能够通过输入输出数据计算状态空间方程,并进行系统建模和预测 1. 自适应子空间辨识理论基础 classdef AdaptiveSubspaceID% 自适应子空间辨识类properties% 系统参数nx %…

MySQL高级技术体系:从复杂检索到自动化管理的实战指南

MySQL高级技术体系:从复杂检索到自动化管理的实战指南引言 在数据库应用从基础查询向复杂业务支撑演进的过程中,MySQL的高级技术成为突破性能瓶颈、保障数据安全、实现自动化运维的核心支撑。 一、高级联结:突破表关…

linux c读写文件

在 Linux 系统中,cat、echo、tee、vim、nano 等命令常用于读写文件。如果你是想了解如何在 Linux 中 C 语言中读写文件,那么可以使用标准库函数 fopen()、fread()、fwrite()、fclose() 等来实现文件的读写。 下面我将…

2025年11月deepseek排名优化评测报告:从核心优势到实战案例的深度解析

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

AI模型数据安全:别让“聪明的大脑”变成安全黑洞

这几年大家都在搞AI,模型越来越大、算力越来越猛,效果也越来越好。不过越是这样,越容易让大家忽略一个问题:安全!你花费大价钱训练出来的模型,可不想被别人白嫖、逆向、偷走权重,更不想在客户现场被人轻轻松松d…

linux c语言线程

在 Linux 系统中,C 语言的线程管理通常通过 POSIX 线程(POSIX Threads,简称 pthreads)来实现。Pthreads 是 Linux 系统中标准的线程库,广泛用于多线程编程。一、C 语言线程的基本概念线程:是程序执行的独立路径,…

linux c语言程序

你好!你提到“Linux C语言程序”,这通常指的是在 Linux 系统上使用 C 语言编写并运行程序。以下是一些关于 Linux 上 C 语言编程的常见命令和脚本示例,以及一些基本概念和工具的介绍。一、C 语言开发环境搭建(Linu…

linux c语言环境

在 Linux 系统中,C 语言的开发和运行通常通过 GCC(GNU Compiler Collection) 来实现。以下是一些常见的 Linux C 语言环境和相关命令的说明:一、安装 GCC(GNU Compiler Collection) Linux 系统中通常已经安装了 …

【第7章 IO编程与异常】文件句柄(File Handle)和 Python 中的文件对象(File Object)详解

文件句柄(File Handle)本质是 操作系统给打开的文件分配的“资源标识ID” —— 你可以把它理解成「文件的专属通行证」:当你用 open() 打开文件时,操作系统会:在磁盘找到该文件,验证访问权限(读/写); 分配一块…

2025年质量好的扁型管缩管机用户口碑最好的厂家榜

2025年质量好的扁型管缩管机用户口碑最好的厂家榜行业背景与市场趋势随着制造业的持续升级和自动化水平的不断提高,扁型管缩管机作为电热设备制造领域的关键设备,市场需求呈现稳定增长态势。据中国机械工业联合会最新…

超大文件怎么发邮件:打破限制的安全传输解决方案

超大文件的邮件传输常常给企业带来各种挑战,尤其在协作频繁的环境中。传统的邮件系统对附件大小设定了严格的限制,导致用户不得不压缩或打包文件,这样不仅耗时,还可能损害文件质量。而Ftrans Outlook超大附件插件的…

2025年口碑好的单螺旋压榨机优质厂家推荐榜单

2025年口碑好的单螺旋压榨机优质厂家推荐榜单行业背景与市场趋势随着环保政策的日益严格和资源回收利用需求的增长,单螺旋压榨机作为固液分离领域的关键设备,近年来市场需求持续攀升。据中国环保机械行业协会最新数据…

2025 企业可观测平台选型实操指南:一文搞懂可观测价值与选型逻辑

文章厘清可观测定义与价值,对比主流可观测平台,从架构、需求、合规给出可观测选型建议,助力企业挑选适配IT运维监控与可观测产品方案。可观测性早已从技术热点转化为企业 IT 运维的必备能力,不过很多企业仍分不清 …

2025年11月生成式引擎优化推荐:十大服务商技术实力与行业应用全景分析

本文基于2025年中国信通院行业公开数据和权威第三方Gartner报告,结合推荐对象参考内容,从专业能力、服务品质、技术实力等维度筛选10个推荐对象,旨在提供客观参考。 评选标准:科学维度下的全面审视 本次评选绝非主…

2025年靠谱的工业净化铝材厂家实力及用户口碑排行榜

2025年靠谱的工业净化铝材厂家实力及用户口碑排行榜行业背景与市场趋势工业净化铝材作为现代工业建筑和高端制造业的重要基础材料,近年来随着半导体、生物医药、食品加工等行业的快速发展,市场需求持续增长。据中国有…