NC16742 [NOIP2002]字串变换
题目
题目描述
已知有两个字串 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]字串变换的更多相关文章
- NOIP2002 字串变换题解(双向搜索)
65. [NOIP2002] 字串变换 时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...
- NOIP2002字串变换[BFS]
题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...
- NOIP2002 字串变换
题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...
- [NOIP2002]字串变换 T2 双向BFS
题目描述 已知有两个字串 A,B 及一组字串变换的规则(至多6个规则): A1−>B1 A2−>B2 规则的含义为:在 A$中的子串 A1可以变换为可以变换为B1.A2可以变换为可 ...
- 双向BFS—>NOIP2002 字串变换
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...
- [NOIP2002] 字串变换 宽搜+深度优化
这道题硬是让我用STL水过.......而且题解里说的什么双向宽搜,交替扩展............... 这道题反正,STL用就用吧,但是状态数可以卡到千亿级别,因为这个东西是阶乘扩展的,然后我们发 ...
- [COGS 0065][NOIP 2002] 字串变换
65. [NOIP2002] 字串变换 ★★ 输入文件:string.in 输出文件:string.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字 ...
- 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换
###题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换 ...
- 「NOIP2002」「Codevs1099」 字串变换(BFS
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知有两个字串 $A$, ...
- [NOIP2002] 提高组P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
随机推荐
- 使用ProjectQ生成量子算法指令集
技术背景 所谓的指令集,按照字面意思来理解就是计算机底层允许使用的操作指令的集合.在量子计算机领域,由于实现方案的不同,在不同的体系内的指令集其实是不一样的,并不是说OpenQASM里面的所有指令都会 ...
- 选择DOM中除一个元素以外的所有元素[Jquery]
$(function(){ $('body > *').not('#myDiv') .on('mouseover', function(){ //... }) .on('click', func ...
- FileZilla 连接不上宝塔
1,修改 pureftp的配置文件 ForcePassiveIP 为服务器的ip , 并去掉 # 2,FileZilla 使用明文连接
- Java - 输出空心菱形
1. 思路:发现菱形的规律 ,定义三个变量,左边距和右边距,中间的边距 . 具体规律观察上图 . 2.上代码: //输出空心菱形 public class ForToLingXing { pub ...
- Go-强制类型转换-T(x)
类型转换 T(x) 具有相同的底层类型 数字类型之间可以互相转换(int系 uint系 float系),较大数转换成较小数会损失精度 字符串与切片之间的转换 string <==> []r ...
- [转帖]一问带你掌握通过storcli做RAID
因为系统不支持直接做raid,所以需要使用storcli这个工具来操作.首先把工具上传到服务器任意目录,并使用命令chmod +x storcli64修改文件权限为可执行. 另外可通过命令ln -s ...
- [转帖]面对龙芯3A5000的逼迫,3A4000要为生存抗争!
https://baijiahao.baidu.com/s?id=1709233817860985518&wfr=spider&for=pc 龙芯3A5000是龙芯中科自主设计的最 ...
- [转帖]Windows系统内置测试工具(winsat)
WinSAT 是 Windows 系统评估工具(Windows System Assessment Tool)的缩写,是从 Windows Vista 开始便内置于系统之中的命令行工具,可对 Wind ...
- Linux慢 进程kswapd0与events/0消耗大量CPU的问题 一次网站宕机的处理
今天下午网站宕了两次机,发工单给阿里云,发现原因是服务器的CPU 100%了. 重启服务器后,使用 top 命令看看是哪些进程消耗那么大的 CPU 使用.盯了有好十几分钟,主要消耗 CPU 的进程有两 ...
- TC插件管理器及在TC中新建文件
新建文件 Shift+F4可以新建文件,但是会调用内置的编辑器来打开. 在设置中通过修改F4快捷键对应的程序来修改. PS.F4编辑没找到根据扩展名来调用指定程序打开,可以F3中进行补充. NewFi ...