双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换

news/2025/2/23 19:04:52/文章来源:https://www.cnblogs.com/ChengZHWang/p/18732635

双向广搜 P1032 洛谷 [NOIP 2002 提高组] 字串变换

题目背景

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

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

题目描述

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

  • \(A_1\to B_1\)
  • \(A_2\to B_2\)

规则的含义为:在 \(A\) 中的子串 \(A_1\) 可以变换为 $ B_1\(,\)A_2$ 可以变换为 \(B_2\cdots\)

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

变换规则为:

  • \(\texttt{abc}\rightarrow\texttt{xu}\)\(\texttt{ud}\rightarrow\texttt{y}\)\(\texttt{y}\rightarrow\texttt{yz}\)

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

  • \(\texttt{abcd}\rightarrow\texttt{xud}\rightarrow\texttt{xy}\rightarrow\texttt{xyz}\)

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

输入格式

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

接下来若干行,每行有两个字符串 \(A_i,B_i\),表示一条变换规则。

输出格式

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

输入输出样例 #1

输入 #1

abcd xyz
abc xu
ud y
y yz

输出 #1

3

说明/提示

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

【题目来源】

NOIP 2002 提高组第二题

思路

双向BFS。

初始串 \(A\) ,目标串 \(B\)

规则拿循环输入,存入string数组里,并计数规则个数,分别为 \(a[N],b[N]\)

代码关键在于extend函数的编写和参数调用。

所有有关队列和哈希的参数都是引用,按照队列大小安排。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 6;
string A, B;
string a[N], b[N];
int n;int extend( queue<string> &q,unordered_map<string, int> &ma,unordered_map<string, int> &mb,string a[N], string b[N])
{int m = q.size();while (m--) {string t = q.front();q.pop();int step = ma[t];for (int i = 0; i < n; i++) {// 枚举规则for (int j = 0; j < t.size(); j++) {// 遍历字符串if (t.substr(j, a[i].size()) == a[i]) {// 找到匹配规则string tmp = t.substr(0, j) + b[i] + t.substr(j + a[i].size());if (ma.count(tmp)) continue;if (mb.count(tmp)) return step + mb[tmp] + 1;// 两边哈希都没有q.push(tmp);ma[tmp] = step + 1;}}}}return 11;
}int bfs()
{if (A == B) return 0;queue<string> qa, qb;unordered_map<string, int> ma,mb;qa.push(A), qb.push(B);ma[A] = mb[B] = 0;int mstep = 10, t;// 最大匹配步数10while (mstep--) {if (qa.size() <= qb.size()) t = extend(qa, ma, mb, a, b);else t = extend(qb, mb, ma, b, a);if (t <= 10) return t;}return 11;
}int main()
{cin >> A >> B;while (cin >> a[n] >> b[n]) n++;int ans = bfs();if (ans == 11) cout << "NO ANSWER!" << endl;else cout << ans << endl;return 0;
}

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

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

相关文章

uniapp uview u-form表单校验:表单有值却校验不通过的问题

<u-form-item label="数量" required prop="num"><u-input v-model="form.num"></u-input> </u-form-item>检查校验不通过的字段值类型是什么,如果是非string类型,要在rules上指定值类型。原因:u-form的校验规则是值…

BUS设计中的DeadLock死锁问题

本文讨论一下 BUS 设计中的 DeadLock 死锁问题,或者叫做 Cyclic Dependency 循环依赖问题。其含义是指 A 的动作导致 B 的动作无法进行下去,同样 B 的动作导致 A 的动作无法进行下去,二者相互依赖,形成死锁。 1 AXI握手死锁 在学习 AXI 协议时,手册中提到了 AXI 握手死锁,…

字符串-str

字符串-str 1.1 特点需要加上引号,单引号与双引号都可以,包含了多行内容的时候还可以用三引号name = rock #报错,没有引号识别为变量名, name = "rock" print(name) name = kyle print(name) name = """rock #多行内容时使用三引号,区分三引…

X00221-基于多智能体强化学习的车联网频谱共享python完整代码

研究基于多智能体强化学习的车联网频谱共享问题,其中多个车与车(V2V)链路复用由车与基础设施(V2I)链路占用的频谱。由于高速移动的车联网环境中信道变化快速,导致基站无法收集到准确的瞬时信道状态信息,从而无法进行集中式资源管理。对此,将资源共享建模为一个多智能体…

Week01【ElementPlus Layout 布局】

Week01【ElementPlus Layout 布局】 📅 2025/02/22 Layout 布局【ElementPlus】 通过基础的 24 分栏,迅速简便地创建布局。组件默认使用 Flex 布局,不需要手动设置 type="flex"。 请注意父容器避免使用 inline 相关样式,会导致组件宽度不能撑满(宽度坍塌)。. …

Linux 中 source命令 和 bash命令的区别

001、 Linuxbash和source命令的区别在于,当你用bash命令执行脚本时,它告诉Linux内核创建一个新的Bash进程来读取和执行脚本,将输出复制到原先的shell进程中,并显示下来. 然而source命令是一个外置的shell,它读取和评估当前shell进程中的文件。为此,脚本所做的所有修改都将…

字符串的编码及解码

1. 字符串的编码及解码解释str类型转换为bytes类型为编码bytes类型转换为str类型为解码2. 字符串的编码str类型转换为bytes类型使用字符串encode()方法语法格式:str.encode(encodeing= utf8,errors=strict/ignore/replace)出错方式:strict:严格的;报错。 ignore:忽略;rep…

3.正向传播与反向传播 - 学习率LR - Batch size - 激活函数 - 损失函数

正向传播尽量降低损失函数梯度梯度是一个向量(矢量),函数在一点处沿着该点的梯度方向变化最快,变化率最大。换而言之,自变量沿着梯度方向变化,能够使应变量(函数值)变化最大。如图:如果想要 w 下降最快就沿着梯度的负方向下降,就能降低损失函数方向传播更新各个参数的…

Qt报错error: member access into incomplete type QTcpSocket

现象解决办法 在mainwindow.cpp文件中添加头文件。 #include <QTcpSocket>

Spring Boot中如何优雅地读取Jar包中的Resources目录下的文件

在Java的Spring Boot项目中,我们经常需要从resources目录下读取配置文件或其他资源文件。在本地开发环境中,我们可以轻松地使用绝对路径访问这些文件,但项目一旦打包成Jar包并部署到服务器上,这种访问方式就失效了。 因此,掌握在Jar包中读取resources目录下文件的方法至关…

开学测试总结owo

经过这次的小测,在这次测试中,我个人认为最大的变化,就是逻辑性增强,sql语句的要求更多了, 这就反应了对于web应用开发这门课对我们专业的用处,还有,前端页面的美化,我认为前端代码,多 数交给AI就可以了,但主要是你自己要明白需求到底是什么,你要完成的项目是什么,…

get current user

02 - 从SpringSecurity中获取当前用户 一行搞定 SecurityContextHolder.getContext().getAuthentication().getPrincipal();这里自定义了一个UserDetailsImpl类实现UserDetails接口, 此时loadUserByUsername方法的返回对象的类型也要改成自定义类型(01篇最后那样), 不然报错。测…