洛谷 P1032 [NOIP2002 提高组] 字串变换

P1032 [NOIP2002 提高组] 字串变换 - 洛谷 | 计算机科学教育新生态

题目来源

洛谷

题目内容

[NOIP2002 提高组] 字串变换

题目背景

本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水,各种做法都可以通过,不代表算法正确。因此本题题目和数据仅供参考。

本题为搜索题,本题不接受 hack 数据。关于此类题目的详细内容

题目描述

已知有两个字串 A , B A,B A,B 及一组字串变换的规则(至多 6 6 6 个规则),形如:

  • A 1 → B 1 A_1\to B_1 A1B1
  • A 2 → B 2 A_2\to B_2 A2B2

规则的含义为:在 A A A 中的子串 A 1 A_1 A1 可以变换为 $ B_1 , , A_2$ 可以变换为 B 2 ⋯ B_2\cdots B2

例如: A = abcd A=\texttt{abcd} A=abcd B = xyz B=\texttt{xyz} Bxyz

变换规则为:

  • abc → xu \texttt{abc}\rightarrow\texttt{xu} abcxu ud → y \texttt{ud}\rightarrow\texttt{y} udy y → yz \texttt{y}\rightarrow\texttt{yz} yyz

则此时, A A A 可以经过一系列的变换变为 B B B,其变换的过程为:

  • abcd → xud → xy → xyz \texttt{abcd}\rightarrow\texttt{xud}\rightarrow\texttt{xy}\rightarrow\texttt{xyz} abcdxudxyxyz

共进行了 3 3 3 次变换,使得 A A A 变换为 B B B

输入格式

第一行有两个字符串 A , B A,B A,B

接下来若干行,每行有两个字符串 A i , B i A_i,B_i Ai,Bi,表示一条变换规则。

输出格式

若在 10 10 10 步(包含 10 10 10 步)以内能将 A A A 变换为 B B B,则输出最少的变换步数;否则输出 NO ANSWER!

样例 #1

样例输入 #1

abcd xyz
abc xu
ud y
y yz

样例输出 #1

3

提示

对于 100 % 100\% 100% 数据,保证所有字符串长度的上限为 20 20 20

【题目来源】

NOIP 2002 提高组第二题

知识点

搜索 字符串

题目思路

找最小步数一般用BFS

这是一个字符串转换的问题,通过广度优先搜索算法(BFS)求解将字符串a转换为字符串b的最小步数。整个过程可以分为以下几个步骤:

  1. 定义全局变量:定义字符串a和b,原字符串数组origin,替换字符串数组translate,替换规则数量n,转换步数ans,和用于记录已访问过字符串的map。
  2. 实现trans函数:该函数在给定字符串str中,从位置i开始尝试替换一段子字符串,如果能够完成替换,则返回替换后的字符串,否则返回空字符串。
  3. 实现bfs函数:使用广度优先搜索算法,寻找将字符串a转换为字符串b的最小步数。首先将初始状态(字符串a,步数0)入队。然后通过队列不断从头取出字符串,判断是否为目标字符串,如果是则记录步数并结束搜索。否则,标记当前字符串为已访问,并尝试对当前字符串的每个位置应用每条替换规则,如果替换成功,则将新字符串入队并更新步数。最终根据ans的值,判断是否有解并输出结果。
  4. 实现主函数main:首先输入原始字符串a和目标字符串b,然后输入替换规则,直到输入为空。最后调用bfs函数解决问题。

AC代码

//
// Created by Jisam on 2024/7/1.
//
#include<bits/stdc++.h>		// 万能头文件,包含标准库函数
#define maxn 15
#define PSI pair<string,int>
#define x first
#define y second
using namespace std;// 全局变量声明
string a, b; // 原始字符串a和目标字符串b
string origin[maxn]; // 原字符串数组
string translate[maxn]; // 替换字符串数组
int n, ans; // n为替换规则数量,ans为转换步数
map<string,int> ma; // 用于记录已访问过的字符串/*** @brief 尝试在字符串str中,从位置i开始替换一段子字符串** @param str 待处理的字符串* @param i 替换开始的位置* @param j 替换所使用的规则索引* @return string 如果可以进行替换,则返回替换后的字符串,否则返回空字符串*/
string trans(const string &str, int i, int j) {string res = "";// 检查是否可以完成替换if(i + origin[j].length() > str.length()) {return res;}for(int k = 0; k < origin[j].length(); k ++) {if(str[i + k] != origin[j][k]) {return res;}}// 实现替换操作res = str;res = res.replace(i, origin[j].size(), translate[j]);
//    res = str.substr(0,i)
//          + translate[j]
//          + str.substr(i + origin[j].length());return res;
}/*** @brief 使用广度优先搜索算法,寻找将字符串a转换为b的最小步数*/
void bfs() {queue<PSI> q;q.push({a, 0}); // 将初始状态(字符串a,步数0)入队while(!q.empty()) {PSI f = q.front();q.pop();// 如果当前字符串已记录过,则跳过if(ma.count(f.x) == 1) {continue;}// 如果找到目标字符串,则记录步数并结束搜索if(f.x == b) {ans = f.y;break;}ma[f.x] = 1; // 标记当前字符串为已访问// 尝试对当前字符串的每个位置应用每条替换规则for(int i = 0; i < f.x.length(); i ++) {for(int j = 0; j < n; j ++) {string t = trans(f.x, i, j);// 如果替换成功,则将新字符串入队if(!t.empty()) {q.push({t, f.y + 1});}}}}// 根据ans的值,判断是否有解并输出结果if(ans > 10 || ans == 0) {cout << "NO ANSWER!" << endl;} else {cout << ans << endl;}
}int main() {cin >> a >> b; // 输入原始字符串a和目标字符串b// 输入替换规则,直到输入为空while(cin >> origin[n] >> translate[n]) {n ++;}bfs(); // 调用广度优先搜索算法return 0;
}

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

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

相关文章

mac|idea导入通义灵码插件

官方教程&#xff1a;通义灵码下载安装指南_智能编码助手_AI编程_云效(Apsara Devops)-阿里云帮助中心 下载插件&#xff1a; ⇩ TONGYI Lingma - JetBrains 结果如下&#xff1a; 选择apply、ok&#xff0c;会出现弹窗&#xff0c;点击登录 可以实现&#xff1a;生成单元测…

《C++20设计模式》代理模式

文章目录 一、前言二、实现1、UML类图2、实现 一、前言 这代理模式和装饰器模式很像啊。都是套一层类。&#x1f630; 主要就是功能差别 装饰器&#xff1a; 为了强化原有类的功能。代理模式&#xff1a; 不改变原有功能&#xff0c;只是强化原有类的潜在行为。 我觉的书上有…

【基于R语言群体遗传学】-8-代际及时间推移对于变异的影响

上一篇博客&#xff0c;我们学习了在非选择下&#xff0c;以二项分布模拟遗传漂变的过程&#xff1a;【基于R语言群体遗传学】-7-遗传变异&#xff08;genetic variation&#xff09;-CSDN博客 那么我们之前有在代际之间去模拟&#xff0c;那么我们就想知道&#xff0c;遗传变…

KVM虚机调整磁盘大小(注:需重启虚拟机)

1、将磁盘大小由15G调整为25G [rootkvm ~]# virsh domblklist kvm-client #显示虚拟机硬盘列表 [rootkvm ~]# qemu-img resize /var/lib/libvirt/images/tesk-disk.qcow2 10G #扩容 [rootkvm ~]# qemu-img info /var/lib/libvirt/images/test-disk.qcow2 #查看信息 注&…

奥威BI方案:多行业、多场景,只打高端局

奥威BI方案&#xff0c;确实以其卓越的性能和广泛的应用领域&#xff0c;在高端数据分析市场中占据了一席之地。以下是对奥威BI方案的详细解析。 奥威BI方案是一款针对多行业、多场景的全面数据分析解决方案&#xff0c;它结合了大数据、云计算等先进技术&#xff0c;为企业提…

LeetCode:3101. 交替子数组计数(Java 找规律)

目录 3101. 交替子数组计数 题目描述&#xff1a; 实现代码与解析&#xff1a; 简洁版&#xff1a; 原理思路&#xff1a; 3101. 交替子数组计数 题目描述&#xff1a; 给你一个二进制数组nums 。如果一个子数组中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们…

看互联网大厂如何落地AI-Agent(3)

vivo一站式AI智能体构建平台的演进实践 引言 在AI技术的浪潮中&#xff0c;vivo互联网产品平台架构团队负责人张硕分享了vivo在构建一站式AI智能体平台方面的演进实践和深刻洞见。 背景与挑战 vivo面临的挑战包括创造商业价值、降低学习成本、合规性、以及LLM&#xff08;大…

hnust 1816: 算法10-9:简单选择排序

hnust 1816: 算法10-9&#xff1a;简单选择排序 题目描述 选择排序的基本思想是&#xff1a;每一趟比较过程中&#xff0c;在n-i1(i1,2,…,n-1)个记录中选取关键字最小的记录作为有序序列中的第i个记录。 在多种选择排序中&#xff0c;最常用且形式最为简单的是简单选择排序。…

FFmpeg常用命令手册

官方文档&#xff1a;ffmpeg Documentation 常规选项 -i input_url 输入文件或者输入流的路径 Main 选项 -f fmt (input/output) 强制指定输入或输出文件的格式&#xff0c; 常见的格式名称包括flv&#xff0c;mp4、hls、mpegts、avi、mov -c[:stream_specifier] codec (i…

收银系统源码-收银台副屏广告

1. 功能描述 门店广告&#xff1a;双屏收银机&#xff0c;副屏广告&#xff0c;主屏和副屏同步&#xff0c;总部可统一控制广告位&#xff0c;也可以给门店开放权限&#xff0c;门店独立上传广告位&#xff1b; 2.适用场景 新店开业、门店周年庆、节假日门店活动宣传&#x…

【HICE】DNS反向解析

反向解析&#xff1a;IP ----> 主机名 1.更改主配置文件 2.:更改反向的信息 3.重启服务 4.测试解析是否成功

聊天服实现设计

聊天服拓扑关系 聊天服独立于游戏服&#xff0c;客户端直连聊天服客户端按 PlayerID 散列&#xff0c;连接聊天服有涉及扣道具才能发言的等&#xff08;必须依赖游戏服功能的&#xff09;&#xff0c;先走游戏服&#xff0c;其他均可以直接走聊天服 聊天频道 - 世界频道 客户…

论文辅导 | 基于多尺度分解的LSTM⁃ARIMA锂电池寿命预测

辅导文章 模型描述 锂电池剩余使用寿命&#xff08;Remaining useful life&#xff0c;RUL&#xff09;预测是锂电池研究的一个重要方向&#xff0c;通过对RUL的准确预测&#xff0c;可以更好地管理和维护电池&#xff0c;延长电池使用寿命。为了能够准确预测锂电池的RUL&…

待研究课题记录

最近了解到两个新的有趣的节点&#xff0c;但是对于实际效果不是很确定&#xff0c;所以这里记录下&#xff0c;后续慢慢研究&#xff1a; 扰动注意力引导 Perturbed Attention Guidance GitHub - KU-CVLAB/Perturbed-Attention-Guidance: Official implementation of "…

默认导出(default)和命名导出

1.默认导出 优点&#xff1a; 简洁的导入语法&#xff1a; 导入时不需要使用花括号&#xff0c;可以直接重命名。单一职责&#xff1a; 模块导出一个主要功能或对象时&#xff0c;默认导出更符合逻辑。 适用场景&#xff1a; 模块只有一个导出&#xff1a; 如一个组件、一个…

CTS单测某个模块和测试项

1 &#xff0c;测试单个模块命令 run cts -m <模块名> 比如&#xff1a;run cts -m CtsUsbTests模块名可以从测试报告中看&#xff0c;如下&#xff1a; 2&#xff0c; 测试单个测试项 run cts -m <模块名> -t <test_name> 比如&#xff1a;run cts -m ru…

Linux程序地址空间

1. 进程地址空间 简单来说&#xff0c;就是从高地址往低地址&#xff0c;内存分区分别是&#xff1a; 内核空间&#xff1a;命令行参数argv和环境变量env等栈区&#xff1a;大部分局部变量&#xff0c;栈区内存往低处增长堆区&#xff1a;用于动态内存管理&#xff0c;堆区内存…

C # @逐字字符串

逐字字符串 代码 namespace TestAppConsole {class program{static void Main(string[] args){int a 0;int b 9;string c "2ui923i9023";//Console.Write(sizeof(int));string d "\t8282jjksk";string e "\t8282jjksk";Console.WriteLine(…

Java——继承(Inheritance)

一、继承简要介绍 1、继承是什么 在Java中&#xff0c;继承是一种面向对象编程的重要特性&#xff0c;它允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;父类或基类&#xff09;的属性和方法。继承的目的是实现代码的重用和设计的层次化。 子类通常…

LT8711GX 国产芯片 Type-C/DP1.4转HDMI2.1 用于加密狗 对接站

描述 LT8711GX是一款高性能的Type-C/DP1.4到HDMI2.1转换器&#xff0c;设计用于将USBType-C源或DP1.4源连接到HDMI2.1收发器。 该LT8711GX集成了一个符合DP1.4标准的接收器和一个符合HDMI2.1标准的发射器。此外&#xff0c;还包括一个CC控制器&#xff0c;用于CC通信&#xff0…