【QED】魔咒解密

news2025/1/7 17:08:04

文章目录

  • 题目
    • 题目描述
    • 输入输出格式
    • 数据范围
    • 测试样例
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度

题目

题目链接🔗

题目描述

在《哈利波特》的魔法世界里,赫敏发现了一本古老的魔法书。这本书记录了许多强力的魔咒,但每个魔咒都被特定的起始咒语 p 1 p_1 p1 和结束咒语 p 2 p_2 p2 包裹着。她需要找到这些咒语,才能揭示出真正的魔法奥秘。

请你帮助赫敏从字符串 s s s 中找到所有被 p 1 p_1 p1 p 2 p_2 p2 包裹的魔咒,以便她能解开魔法书的奥秘,以下是赫敏发现的一些规律。

  1. 起始咒语 p 1 p_1 p1 和结束咒语 p 2 p_2 p2 中可能会有魔法师可以自由发挥的地方使用字符 # 表示,这些地方可以是 0 ∼ 9 0 \sim 9 09 的任意数字。

  2. 任何一个有效的魔咒以及它的起始咒语和结束咒语不会与其他有效的魔咒重叠。

  3. 空白的魔咒也是魔咒。

  4. 若有魔咒先前出现过,该魔咒仍然需要输出。

  5. 我们按照从左到右的顺序进行处理。每当我们遇到一个起始咒语,就开始寻找对应的结束咒语,直到找到为止,形成一个有效的魔咒,完成了一次匹配。在整个过程中,已经匹配到的魔咒(包括起始咒语和结束咒语)不再参与后续的匹配。

输入输出格式

【输入格式】

第一行给出一个数字 T T T ,表示样例数。

对于每一个样例,第一行给出 p 1 p_1 p1

第二行给出 p 2 p_2 p2

第三行给出 s s s

【输出格式】

对于每一个样例,第一行输出一个数字 n n n ,表示找到的魔咒总数。

接下来 n n n 行输出找到的魔咒。

数据范围

0 < T ≤ 50 0<T\le50 0<T50

0 < p 1 , p 2 ≤ 10 0<p_1,p_2\le10 0<p1p210 (此处指字符串长度,下 s s s 同)

0 < s < 10000 0<s<10000 0<s<10000

测试样例

input1

2
ab#c
de
ab0cab1cABCdedeabbcDEFdeab2cdeab3cGHIde
aa
aa
aaAAaaAAaaAAaaAA

output1

3
ab1cABC

GHI
2
AA
AA

思路

题目大意

遍历字符串交替查找p1,p2,记录所有p1,p2之间的子字符串

这道题是基于正则表达式改编的,将p1,p2中的#替换为[0-9],部分选手可能考虑使用 f"{p1}(.*?){p2}"匹配。
但这会导致超时,我们需要直接遍历整个字符串进行逐字符匹配:

  • 对于不是 # 的字符,要求两个字符串中的对应字符一致。
  • 对于 #字符,要求匹配的字符的 ASCI 码值在区间[48,57]之中(判断是否是数字)。由于 p1,p2 的长度非常短,可以视为只对 s 进行了 O(n)的一次遍历,时间复杂度为 O(n)。

代码

#include<bits/stdc++.h>
using namespace std;

// p1, p2 表示起始和结束咒语,s 表示给定的字符串
string p1,p2,s;

// 判断 x 和 y 是否匹配
bool check(string x, string y)
{
    // 如果长度不一样,直接返回 false
    if(x.size()!=y.size())
        return false;
    // 遍历每个字符,进行匹配
    for(int i=0; i<x.size(); i++)
    {
        // 如果 y 的字符是 #,检查 x 中相应字符是否是数字
        if(y[i]=='#')
        {
            if(isdigit(x[i])==false) // 如果不是数字,返回 false
                return false;
        }
        else
            // 如果 y 中对应位置的字符不是 #,则直接进行字符匹配
            if(x[i]!=y[i])
                return false;
    }
    // 如果所有字符都匹配,返回 true
    return true;
}

int main()
{
    int T; 
    cin>>T;
    while(T--)
    {
        // 读取 p1, p2 和字符串 s
        cin>>p1>>p2>>s;
        vector<string> ans; // 用来存储找到的魔咒
        // 从字符串 s 开始遍历
        for(int i=0; i<s.size(); i++)
        {
            // 如果当前位置的子串匹配起始咒语 p1
            if(check(s.substr(i, p1.size()), p1)) 
            {
                int j;
                bool found=false;
                // 从 i + p1.size() 开始查找匹配的结束咒语 p2
                for(j=i+p1.size(); j<s.size(); j++)
                {
                    // 如果找到匹配的结束咒语 p2
                    if(check(s.substr(j, p2.size()), p2))
                    {
                        found=true;
                        break; // 找到结束咒语后,跳出内层循环
                    }
                }
                // 如果找到了匹配的 p2,存储该魔咒,并更新 i 的值跳过已经匹配的部分
                if(found)
                {
                    ans.push_back(s.substr(i+p1.size(), j-i-p1.size())); // 存储魔咒
                    i=j+p2.size()-1; // 更新 i,跳过结束咒语部分
                }
                else
                    break; // 如果没有找到结束咒语,结束当前查找
            }
        }
        // 输出找到的魔咒数量
        cout<<ans.size()<<endl;
        // 输出每个魔咒
        for(auto &s: ans)
            cout<<s<<endl;
    }

    return 0;
}

复杂度分析

时间复杂度

对于每个测试用例,我们遍历字符串 s 中的每个字符。每次找到一个起始咒语 p1,我们再从当前位置开始查找结束咒语 p2。因此:
外层循环遍历字符串 s 的每个字符:时间复杂度为 O(n),其中 n 是字符串 s 的长度。
内层循环在找到一个起始咒语后,继续从当前位置查找结束咒语 p2。长度较短,可视为O(1)
因此,整个算法的时间复杂度是 O(n),其中 n 是字符串 s 的长度。

空间复杂度

程序中使用了一个 vector ans 来存储找到的魔咒。最坏情况下,每个字符都能找到一个魔咒,因此空间复杂度为 O(n),其中 n 是字符串 s 的长度。
此外,check 函数中使用了固定大小的字符串,空间复杂度是常数级别的。

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

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

相关文章

springboot实战纪实-课程介绍

教程介绍 Spring Boot是由Pivotal团队提供的一套开源框架&#xff0c;可以简化spring应用的创建及部署。它提供了丰富的Spring模块化支持&#xff0c;可以帮助开发者更轻松快捷地构建出企业级应用。 Spring Boot通过自动配置功能&#xff0c;降低了复杂性&#xff0c;同时支持…

源代码编译安装X11及相关库、vim,配置vim(2)

一、编译安装vim 编译时的cofigure选项如下.只有上一步的X11的包安装全了&#xff08;具体哪些是必须的&#xff0c;哪些是多余的没验证&#xff09;&#xff0c;configure才能认为X的库文件和头文件是可以用的 ./configure --prefixpwd/mybuild \--x-includes/path/to/X11/m…

直接插入排序、折半插入排序、2路插入排序、希尔排序

本篇是排序专栏博客的第一篇&#xff0c;主要探讨以 “插入” 为核心思想的排序算法该如何实现 文章目录 一、前言二、直接插入排序1. 算法思想与操作分析2. 代码实现version 1version 2 3. 复杂度分析 三、折半插入排序1. 算法思想与操作分析2. 代码实现3. 复杂度分析 四、2路…

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源&#xff0c;执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

让 Agent 具备语音交互能力:技术突破与应用前景(16/30)

让 Agent 具备语音交互能力&#xff1a;技术突破与应用前景 一、引言 在当今数字化时代&#xff0c;人机交互方式正经历着深刻的变革。从早期的命令行界面到图形用户界面&#xff0c;再到如今日益普及的语音交互&#xff0c;人们对于与机器沟通的便捷性和自然性有了更高的追求…

学生作业完成情况管理程序

网上看到的一个课程设计,正好练练手。 首先设计数据库 数据库有三张表&#xff0c;分别是班级表&#xff0c;学生表&#xff0c;作业成绩表。 学生表中外键关联班级表&#xff0c;作业成绩表中外键关联学生表。具体如下图所示 班级表 学生表学生表外键关联 …

基于vue的商城小程序的毕业设计与实现(源码及报告)

环境搭建 ☞☞☞ ​​​Vue入手篇(一)&#xff0c;防踩雷(全网最详细教程)_vue force-CSDN博客 目录 一、功能介绍 二、登录注册功能 三、首页 四、项目截图 五、源码获取 一、功能介绍 用户信息展示&#xff1a;页面顶部设有用户头像和昵称展示区&#xff0c;方便用户识别…

DeepSeek V3“报错家门”:我是ChatGPT

搜 &#xff1a;海讯无双Ai 要说这两天大模型圈的顶流话题&#xff0c;那绝对是非DeepSeek V3莫属了。 不过在网友们纷纷测试之际&#xff0c;有个bug也成了热议的焦点—— 只是少了一个问号&#xff0c;DeepSeek V3竟然称自己是ChatGPT。 甚至让它讲个笑话&#xff0c;生成…

利用webworker解决性能瓶颈案例

目录 js单线程的问题webworker的基本使用webworker的常见应用可视化优化导出Excel js单线程的问题 众所周知&#xff0c;js不擅长计算&#xff0c;计算是同步的&#xff0c;大规模的计算会让js主线程阻塞&#xff0c;导致界面完成卡死。比如有一个600多亿次的计算&#xff0c;…

深入理解卷积神经网络(CNN):图像识别的强大工具

1、引言 卷积神经网络&#xff08;CNN&#xff09;是一种深度学习模型&#xff0c;特别适合分析视觉数据。它们在处理图像和视频任务时表现尤为出色。由于CNN在物体识别方面的高效性&#xff0c;这种网络架构广泛应用于计算机视觉领域&#xff0c;例如图像分类、物体检测、面部…

R语言安装教程与常见问题

生物信息基础入门笔记 R语言安装教程与常见问题 今天和大家聊一个非常基础但是很重要的技术问题——如何在不同操作系统上安装R语言&#xff1f;作为生物信息学数据分析的神兵利器&#xff0c;R语言的安装可谓是入门第一步&#xff0c;学术打工人的必备技能。今天分享在Windows…

VOC数据集格式转YOLO格式

将VOC格式的数据集转换为YOLO格式通常涉及以下几个步骤。YOLO格式的标注文件是每个图像对应一个.txt文件&#xff0c;文件中每一行表示一个目标&#xff0c;格式为&#xff1a; <class_id> <x_center> <y_center> <width> <height>其中&#xf…

win10搭建zephyr开发环境

搭建环境基于 zephyr官方文档 基于官方文档一步一步走很快就可以搞定 一、安装chocolatey 打开官网 https://community.chocolatey.org/courses/installation/installing?methodinstall-from-powershell-v3 1、用管理员身份打开PowerShell &#xff08;1&#xff09;执行 …

物体切割效果

1、物体切割效果是什么 在游戏开发中&#xff0c;物体切割效果就是物体看似被切割、分割或隐藏一部分的视觉效果。 这种效果常用与游戏和动画中&#xff0c;比如角色攻击时的切割效果&#xff0c;场景中的墙壁切割效果等等。 2、物体切割效果的基本原理 在片元着色器中判断片…

k8s集群监控系统部署方案

1.方案介绍 本文介绍一种k8s集群监控系统,该系统可以监控k8s集群中的pod和node的性能指标,以及K8s资源对象的使用情况。 监控流程: 集群资源数据采集(cadvisor、node-exporter、kube-state-metrics)-- 数据收集、存储、处理等(prometheus)-- 数据可视化查询和展示(gra…

RP2K:一个面向细粒度图像的大规模零售商品数据集

这是一种用于细粒度图像分类的新的大规模零售产品数据集。与以往专注于相对较少产品的数据集不同&#xff0c;我们收集了2000多种不同零售产品的35万张图像&#xff0c;这些图像直接在真实的零售商店的货架上拍摄。我们的数据集旨在推进零售对象识别的研究&#xff0c;该研究具…

Linux(Centos 7.6)命令详解:ls

1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l&#xff0c;long list 使用长列表格式-a&#xff0c;all 不忽略.开头的条目&#xff08;打印所有条目&#xff0c;包括.开头的隐藏条目&#xff09…

比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit

文章目录 EGT-Ensemble Graphics Toolkit介绍EGT具备非常高的图形渲染效率EGT采用了非常优秀的开源2D图形处理引擎-Cairo开源2D图形处理引擎Cairo的优势Cairo 2D图像引擎的性能Cairo 2D图像引擎的实际应用案例彩蛋 - 开源EDA软件KiCAD也在使用Cairo EGT高效的秘诀还有哪些Cairo…

密码学精简版

密码学是数学上的一个分支&#xff0c;同时也是计算机安全方向上很重要的基础原理&#xff0c;设置密码的目的是保证信息的机密性、完整性和不可抵赖性&#xff0c;安全方向上另外的功能——可用性则无法保证&#xff0c;可用性有两种方案保证&#xff0c;冗余和备份&#xff0…

WPF通过反射机制动态加载控件

Activator.CreateInstance 是 .NET 提供的一个静态方法&#xff0c;它属于 System 命名空间。此方法通过反射机制根据提供的类型信息。 写一个小demo演示一下 要求&#xff1a;在用户反馈界面点击建议或者评分按钮 弹出相应界面 编写MainWindow.xmal 主窗体 <Window x:C…