题目链接

题目

题目描述

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

A1 -> B1

A2 -> B2

规则的含义为:在A中的子串 A1可以变换为 B1、A2可以变换为 B2 …。

例如:A='abcd' B='xyz'

变换规则为:

‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’

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

‘abcd’->‘xud’->‘xy’->‘xyz’

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

输入描述

输入格式如下:

A B

A1 B1 \

A2 B2 |-> 变换规则

... ... /

所有字符串长度的上限为 20。

输出描述

输出格式如下:

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

示例1

输入

abcd xyz
abc xu
ud y
y yz

输出

3

题解

知识点:BFS,字符串。

这道题普通bfs也能过,不过可以用来练练dbfs。从结果和起点同时扩展,如果步数相加超过 \(10\) 说明十步只能无解,否则只要在对方状态里找到自己当前状态再将步数相加返回即可。要注意正向扩展和反向扩展规则是相反的。

要注意的是每步变换不一定只有一次,同一条规则可能用在不同的位置要注意不要漏了。

字符串替换用 string 的成员函数 replace 是真的香2333。

时间复杂度 \(O(?)\)

空间复杂度 \(O(?)\)

代码

#include <bits/stdc++.h>

using namespace std;

vector<pair<string, string>> dir;

int bfs(string init, string ans) {

    map<string, int> vis1, vis2;
vis1[init] = 0;
vis2[ans] = 0; queue<string> q1, q2;
q1.push(init);
q2.push(ans); while (!q1.empty() && !q2.empty()) {
string a = q1.front();
string b = q2.front();
q1.pop();
q2.pop(); if (vis1[a] + vis2[b] > 10) return -1;///层数都只增不减,两者之和大于10,就算之后找到了也是no answer
if (vis2.count(a)) return vis1[a] + vis2[a];
else if (vis1.count(b)) return vis1[b] + vis2[b];
for (int i = 0;i < dir.size();i++) {
size_t pos = 0;
while (~(pos = a.find(dir[i].first, pos))) {
string aa = a;
aa.replace(pos, dir[i].first.size(), dir[i].second);
pos++;
if (vis1.count(aa)) continue;
vis1[aa] = vis1[a] + 1;
q1.push(aa);
}
}
for (int i = 0;i < dir.size();i++) {
size_t pos = 0;
while (~(pos = b.find(dir[i].second, pos))) {
string bb = b;
bb.replace(pos, dir[i].second.size(), dir[i].first);
pos++;
if (vis2.count(bb)) continue;
vis2[bb] = vis2[b] + 1;
q2.push(bb);
}
}
}
return -1;
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
string init, ans;
cin >> init >> ans; string a, b;
while (cin >> a >> b) dir.push_back({ a,b });
int t = bfs(init, ans);
if (~t) cout << t << '\n';
else cout << "NO ANSWER!" << '\n';
return 0;
}

NC16742 [NOIP2002]字串变换的更多相关文章

  1. NOIP2002 字串变换题解(双向搜索)

    65. [NOIP2002] 字串变换 时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...

  2. NOIP2002字串变换[BFS]

    题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...

  3. NOIP2002 字串变换

    题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...

  4. [NOIP2002]字串变换 T2 双向BFS

    题目描述 已知有两个字串  A,B  及一组字串变换的规则(至多6个规则): A1−>B1 A2−>B2 规则的含义为:在  A$中的子串  A1可以变换为可以变换为B1.A2可以变换为可 ...

  5. 双向BFS—>NOIP2002 字串变换

    如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...

  6. [NOIP2002] 字串变换 宽搜+深度优化

    这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展............... 这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发 ...

  7. [COGS 0065][NOIP 2002] 字串变换

    65. [NOIP2002] 字串变换 ★★   输入文件:string.in   输出文件:string.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字 ...

  8. 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换

    ###题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换 ...

  9. 「NOIP2002」「Codevs1099」 字串变换(BFS

    1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold   题目描述 Description 已知有两个字串 $A$, ...

  10. [NOIP2002] 提高组P1032 字串变换

    题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...

随机推荐

  1. 在Chrome中安装扩展程序

    场景:在Chrome中安装NetBeans Connector插件,将下载好的crx文件拖到扩展程序页面时,发现该插件并没有安装成功. 分析:浏览器默认禁用了拖入安装 .crx 扩展的功能,导致crx ...

  2. Shell 脚本编程学习

    本文为博主原创,转载请注明出处: 目录: 1. shell 变量 2. 运算符 3. if 语句 4.for 循环 5.while 语句 6. case 语法 7.跳出循环:continue 与 br ...

  3. 供应链投毒预警 | 恶意Py包仿冒tensorflow AI框架实施后门投毒攻击

    概述 本周(2024年01月15号),悬镜供应链安全实验室在Pypi官方仓库(https://pypi.org/)中捕获1起Py包投毒事件,投毒者利用包名错误拼写(typo-squatting)的攻击 ...

  4. 笔记本也能飞:运行chat大模型

    背景 在过去的一年,ChatGPT的崛起彻底改变了我们与AI的交互方式.它不再是被动的信息提供者,而是成为了一个可以与我们自由交流.分享知识的伙伴.无论是生活中的琐事,还是工作中的难题,ChatGPT ...

  5. [转帖]haproxy

    HAProxy是一个使用C语言编写的自由及开放源代码软件,其提供高可用性.负载均衡,以及基于TCP和HTTP的应用程序代理. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保 ...

  6. [转帖]数据可视化之redash(支持43种数据源) (转自https://anjia0532.github.io/2019/07/08/redash/)

    https://www.cnblogs.com/a00ium/p/13177272.html 人类都是视觉动物,讲究一图胜千言.如果没了可视化,那么你在跟领导汇报工作时,很大程度会鸡同鸭讲.其实 ex ...

  7. [转帖]【有效解决】Edge浏览器提示你的连接不是专用连接怎么办?

    https://www.xitongzhijia.net/xtjc/20230524/290887.html Win11正式版iso镜像最新(22H2新版) V2023 大小:4.22 GB类别:Wi ...

  8. [转帖]jemalloc内存分配算法

    https://www.cnblogs.com/xiaojiesir/p/15450732.html jemalloc内存分配算法简介 jemalloc 是由 Jason Evans 在 FreeBS ...

  9. linux 查看系统计划任务相关的命令

    最近公司排查计划任务: for i in `ls /etc/cron.d` ; do cat /etc/cron.d/$i |grep -v "#" ; done for i in ...

  10. vue3新特性teleport传送原来这么神奇

    我对teleport的理解 teleport有传送的意思,读音[te li po t][嘻嘻],看官们应该知道读啥子了吧 它可以将你写的代码传送到某一个地方 传送到哪一个地方呢? 传送到你标记的地方, ...