原题连接: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. SQL: Unknown collation: 'utf8mb4_0900_ai_ci'

    错误原因 字符集错误,我的版本是5.7,文件中是8.0 解决方案 替换字符集 utf8mb4_0900_ai_ci替换为utf8_general_ci utf8mb4替换为utf8 注意:注释中的部分 ...

  2. FJOI2022 游记

    2022.3.28 省选延期,延到了4.16 2022.4.11 省选又延期,延到了5.2 FJOI 要回来了!! Day -7 开始停课了 QwQ Day -6 打摆 Day -5 打摆 不行,我不 ...

  3. [kubernetes]集群中部署CoreDNS服务

    前言 从k8s 1.11版本开始,k8s集群的dns服务由CoreDNS提供.之前已经使用二进制文件部署了一个三master三node的k8s集群,现在需要在集群内部部署DNS服务. 环境信息 IP ...

  4. 部署安装maven和mvnd

    前言 maven是常见的java构建工具,优点是稳定可靠,缺点是构建太慢,maven-mvnd是maven的强化版,致力于提高构建速度,默认情况下,mvnd 使用多核CPU并行构建. 常见的java构 ...

  5. [kvm]创建虚拟机

    创建虚拟机示例 # 使用iso创建虚拟机 virt-install --virt-type kvm --os-type=linux --name temp_debian11 \ --memory 16 ...

  6. __wakeup()魔术方法绕过(CVE-2016-7124)

    __wakeup()魔术方法绕过(CVE-2016-7124) 漏洞简介 在php反序列化数据过程中,如果类中存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方 ...

  7. 产品代码都给你看了,可别再说不会DDD(五):请求处理流程

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...

  8. MQTT vs. XMPP,哪一个才是IoT通讯协议的正解

    MQTT vs. XMPP,哪一个才是IoT通讯协议的正解 这是个有趣的话题! 先来聊几个小故事. 关于我和MQTT 我在人生第一个IoT项目里,第一次接触到MQTT协议. 我很快就理解了这个协议.因 ...

  9. 如何get一个终身免费续期的定制数字人?

    想拥有一个"数字分身" 吗?给你一个终身免费续期的特权. 定制周期长?训练.运营成本高?成片效果生硬?无法应用于实际场景? 随着AIGC技术的快速发展,虚拟数字人的生成效率不断提高 ...

  10. 记一次 .NET 某电力系统 内存暴涨分析

    一:背景 1. 讲故事 前些天有位朋友找到我,说他生产上的程序有内存暴涨情况,让我帮忙看下怎么回事,最简单粗暴的方法就是让朋友在内存暴涨的时候抓一个dump下来,看一看大概就知道咋回事了. 二:Win ...