洛谷 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.mfbz.cn/a/772913.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业级监控系统Zabbix

文章目录 Zabbix介绍Zabbix架构Zabbix serverZabbix agentZabbix proxy Zabbix Server的安装Zabbix Agent的安装监控主机流程zabbix_get自定义模板和监控项实战用户登录数监控1.指定监控项命令2.重启Agent服务3.在Server上创建监控项4.测试监控项5.查看监控项图形 触发器定义触…

字符设备驱动程序

简单做个模板框架 字符设备开发流程 确定设备号dev_t&#xff0c;动态分配 alloc_chrdev_region() 或静态分配 register_chrdev_region()定义file_opeartion 结构体*fops *&#xff0c;在结构体成员中实现对应的 *open()、read()*等函数。cdev_init() 将 fops 与 cdev 绑定&…

STM32学习历程(day2)

GPIO解释 GPIO(General-purpose input/output) 可以配置为八种输入输出模式 引脚电平 0V-3.3V 部分引脚可容忍5v 输出模式可控制端口输出高低电平 用以驱动LED、控制蜂鸣器、模拟通信协议输出时序 输入模式可读取端口的高低电平或电压&#xff0c;用于读取按键输入、外界…

firefly rk3588 sdk安装问题记录

目录 一、python版本不对 1.1 下载python2.6 1.2 安装python2.6 1.3 安装遇到问题 二、安装hashlib 三、更新3588 SDK代码 一、python版本不对 我的环境的python版本是python3.7。初次安装的时候执行命令报错&#xff0c;说是版本不对导致 fuhdell:rk3588_sdk$ .repo/rep…

centos通过官网下载安装最新版mysql方案

官网下载步骤&#xff1a; 点击DOCUMENTATION mysql的yum仓库Using the MySQL Yum Repository 向下翻&#xff0c;查看安装命令 点击下载mysql安装包 下载对应的版本 不注册&#xff0c;直接下载社区版 下载好的安装包 安装步骤&#xff1a; 把rpm包导入到服务器…

AI 驱动的数据中心变革与前景

文章主要探讨了AI计算时代数据中心的转型&#xff0c;涉及计算技术的多样性、规格尺寸和加速器的发展、大型语言模型&#xff08;LLM&#xff09;的发展、功耗和冷却趋势、基准测试的重要性以及数据中心的发展等方面。为大家提供深入了解AI基础设施发展的视角。 计算技术的多样…

​浅谈 Linux 中的 core dump 分析方法

在 Linux 系统开发领域中&#xff0c;core dump&#xff08;核心转储&#xff09;是一个不可或缺的工具&#xff0c;它为我们提供了在程序崩溃时分析程序状态的重要线索。当程序因为某种原因&#xff08;如段错误、非法指令等&#xff09;异常终止时&#xff0c;Linux 系统会尝…

spring boot + vue3+element plus 项目搭建

一、vue 项目搭建 1、创建 vue 项目 vue create vue-element说明:创建过程中可以选择路由,也可也可以不选择,可以通过 npm install 安装 vue 项目目录结构 说明:api 为自己创建的文件夹,router 选择路由模块会自动创建 router下的index.js文件(配置路由的文件) im…

泰国内部安全行动司令部数据泄露

BreachForums 论坛的一名成员宣布发生一起重大数据泄露事件&#xff0c;涉及泰国内部安全行动司令部 (ISOC)&#xff0c;该机构被称为泰国皇家武装部队的政治部门。 目前&#xff0c;我们无法准确确认此次泄露的真实性&#xff0c;因为该组织尚未在其网站上发布有关该事件的任…

微信开发者工具报错 Error: module ‘xxx.js‘ is not defined, require args is ‘xxx.js‘

背景 报错如下 检查 代码逻辑和写法都是ok的重新打开项目又是可以的 解决方案 先确保微信开发者工具和uniapp的将js编译成es5都开着&#xff08;这个是默认开的&#xff09; 然后把微信开发者工具关了重开 一般做这一步就会好了&#xff0c;但是只是临时解决 &#xff08…

如何使用 3D 建模库在 C# 中将 3DS 转换为 USDZ?

USDZ/USD是一种 3D 文件格式&#xff0c;被广泛用于跨平台共享 3D 资产。另一方面&#xff0c;3DS是另一种以块形式存储数据的 3D 文件格式。在某些情况下&#xff0c;您需要将3DS 文件转换为 USDZ/USD文件格式。因此&#xff0c;本篇博文介绍了一个功能丰富的3D 建模库&#x…

记录一下简单导入导出excel二级表头

数据库导入导出表头 之前的工具类GenerateExcelToFile新增两个导出这种二级表头方法 package com.njry.utils;import cn.hutool.core.util.IdUtil; import com.njry.config.FileProperties; import com.njry.exception.BadRequestException; import org.apache.poi.hssf.user…

《Winodws API每日一练》8.2 static控件

在 Windows 编程中&#xff0c;"Static" 控件是一种常见的用户界面元素&#xff0c;用于显示静态文本或图像&#xff0c;而无法进行用户交互。它通常用于显示标签、标题、说明文本或静态图像等信息。Static 控件是一种静态的、只读的显示元素&#xff0c;不接受用户的…

JAVA 快递100wms工具类

快递wms工具类 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.kuaidi100.sdk.api.QueryTrack; import com.kuaidi100.sdk.api.Subscribe; import com.kuaidi100.sdk.contant.ApiInfoConstant; import c…

11.SQL注入-盲注基于(base on boolian)

SQL注入-盲注基于boolian案例利用 首先总结一下sql语句中的函数意思 #查看当前所在的数据库 mysql> select database(); ------------ | database() | ------------ | pikachu | ------------ 1 row in set (0.00 sec)#函数substr里1是从第几位开始取字符&#xff0c;2…

mybatis-使用自动生成(根据数据库反向生成pojo、映射文件,映射接口)

1.在pom.xml中导入依赖和插件 <dependencies> <!-- 导入自动生成依赖--><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version>&…

【PCIe】P2P DMA

PCIe P2P (peer-to-peer communication)是PCIe的一种特性&#xff0c;它使两个PCIe设备之间可以直接传输数据&#xff0c;而不需要使用主机RAM作为临时存储。如下图3的走向 比如EP1要发送和数据给EP2,操作流程如下&#xff1a; 1. 打开EP1的dma控制器&#xff1b;--client侧 …

go开源webssh终端源码main.go分析

1.地址: https://github.com/Jrohy/webssh.git 2.添加中文注释地址: https://github.com/tonyimax/webssh_cn.git main.go分析 主包名&#xff1a;main package main //主包名 依赖包加载 //导入依赖包 import ("embed" //可执行文件…

密码学复习

目录 基础 欧拉函数 欧拉函数φ(n)定义 计算方法的技巧 当a=a_1*a_2*……*a_n时 欧拉定理 剩余系 一些超简单密码 维吉尼亚 密钥fox 凯撒(直接偏移) 凯特巴氏(颠倒字母表) 摩斯密码(字母对应电荷线) 希尔(hill)密码 一些攻击 RSA 求uf+vg=1 快速幂模m^…

苹果获得OpenAI董事会观察员职位、Runway最新估值40亿美元

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 据知情人士透露&#xff0c;苹果应用商店&#xff08;App Store&#xff09;负责人、前营销主管Phil Schiller被选中担任这一职位。这位知情人士说&#xff0c;作为董事会观察员&#xff0c;他不会以正…