原题连接:AcWing 190. 字串变换

题意:

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

\(A_1→B_1\)

\(A_2→B_2\)

\(…\)

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

例如:\(A=abcd \,\,\, B=xyz\)

变换规则为:

\(abc → xu \,\,\,\, ud → y \,\,\,\, y → yz\)

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

\(abcd → xud → xy → xyz\)

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

输入格式

输入格式如下:

\(A \,\,\, B\)

\(A_1 \,\,\, B_1\)

\(A_2 \,\,\, B_2\)

… …

第一行是两个给定的字符串 \(A\) 和 \(B\)。

接下来若干行,每行描述一组字串变换的规则。

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

输出格式

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

双向BFS:

从起始状态,目标状态分别开始,两边轮流进行,每次扩展数量小的那一层(即队列中元素数小的那一层),扩展一层,当两边各自一个状态在记录数组中发生重复时,就说明两个搜索过程相遇了,可以合并得到起点的最小步数。

// Problem: 字串变换
// Contest: AcWing
// URL: https://www.acwing.com/problem/content/192/
// Memory Limit: 64 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org) #include <bits/stdc++.h> using namespace std; const int N = 6; int n;
string a[N], b[N]; int extend(queue<string> &q, unordered_map<string, int> &da, unordered_map<string, int> &db, string a[], string b[]) {
int SZ = q.size();
while (SZ--) {
auto t = q.front();
q.pop(); for (int i = 0; i < t.size(); i++) { //枚举字符串起点
for (int j = 0; j < n; j++) {
if (t.substr(i, a[j].size()) == a[j]) {
string state = t.substr(0, i) + b[j] + t.substr(i + a[j].size());
if (da.count(state)) continue;
if (db.count(state)) return da[t] + 1 + db[state];
da[state] = da[t] + 1;
q.push(state);
}
}
}
} return 11;
} int bfs(string A, string B) {
unordered_map<string, int> da, db;
queue<string> qa, qb;
qa.push(A);
qb.push(B);
da[A] = 0, db[B] = 0; while (qa.size() && qb.size()) {
int t; if (qa.size() <= qb.size())t = extend(qa, da, db, a, b); //先搜少的那个集合
else t = extend(qb, db, da, b, a); if (t <= 10) return t;
} return 11;
} int main() {
string A, B;
cin >> A >> B;
while (cin >> a[n] >> b[n]) n++; int step = bfs(A, B);
if (step > 10) puts("NO ANSWER!");
else cout << step << endl; return 0;
}

AcWing 190. 字串变换的更多相关文章

  1. NOIP2002字串变换[BFS]

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

  2. 字串变换(codevs 1099)

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

  3. NOIP2002 字串变换

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

  4. 字串变换 (2002 年NOIP全国联赛提高组)

    一道看似非常水的题 大意 :将一个字串 经过几种变换规则变为给定的另一个子串 ,求最小操作数. code[vs] 传送门 洛谷传送门 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): ...

  5. NOIP 2002 提高组 字串变换

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

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

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

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

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

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

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

  9. 洛谷 P1032 字串变换

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

  10. P1032 字串变换 字符串BFS

    题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A_2A2​ -> B_2B2​ 规则的含义为:在 AA中的子串 A_1A1​ ...

随机推荐

  1. appium环境搭建python

    python appium环境搭建   appium是什么? 1,appium是开源的移动端自动化测试框架:2,appium可以测试原生的.混合的.以及移动端的web项目:3,appium可以测试io ...

  2. markdown之mermaid

    官方文档 01 简单的流程图 TD或TB:top to bottom,从上到下的流程图 LR:从左到右 其它:RL,BT flowchart LR; A([节点A的圆矩框]) --> |AB之间 ...

  3. 基于Word2Vec的诗词生成器

    基于Word2Vec制作的诗词生成器 1.什么是Word2Vec? Word2vec 是 Word Embedding 方式之一,属于 NLP 领域.它是从大量文本预料中以无监督方式学习语义知识的模型 ...

  4. 【Windows】KMS 激活命令记录

    目录 KMS 服务器激活 Office.Visio 推荐使用 office tool plus 部署并配置 KMS 激活 什么是 KMS? KMS 正版与否的区别 总结 KMS 服务器激活 利用 KM ...

  5. 《HelloGitHub》第 89 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  6. WPF MVVM之点滴分享

    (第五点:绑定源有修改) 我并不打算长篇累牍的介绍什么是MVVM.我尽量简洁的介绍,并把自己的经验分享给大家. 一.关于MVVM M:Model,数据模型(后台存储数据的类) V:View,视图(大部 ...

  7. Linux下导入MySQL数据库

    导入数据库1.首先建空数据库mysql>create database abc; 2.导入数据库方法一:(1)选择数据库mysql>use abc;(2)设置数据库编码mysql>s ...

  8. rnacos实现raft和类distro协议,支持集群部署

    1. rnacos 简介 rnacos是一个用rust实现的nacos服务. rnacos是一个轻量. 快速.稳定.高性能的服务:包含注册中心.配置中心.web管理控制台功能,支持单机.集群部署. r ...

  9. redis基本数据类型 Hash

    Hash 类型 Hash类型的常见命令 HSET key field value: 添加或者修改hash类型key的field的值HGET key field: 获取一个hash类型key的field ...

  10. DevOps|破除壁垒,重塑协作-业务闭环释放产研运协作巨大效能

    - 会议太多了,员工开会效率降低了50%! 上篇文章<研发效能组织架构:职能独立vs业务闭环>介绍了职能独立型组织架构和业务闭环型组织架构的特点,优劣势.也许有的小伙伴可能对这两种组织架构 ...