题解:P1032 [NOIP 2002 提高组] 字串变换
题目链接:link。
为了高效地解决这道题目,我们考虑使用双向搜索解决。
我们从 \(A\) 和 \(B\) 同时开始搜索,要是中间有相遇,那么就说明 \(A\) 能变成 \(B\) 这样我们就结束搜索,在搜索的过程中,我们还需要记录 \(A\) 变成 \(B\) 的步数,如果步数小于等于 \(10\) 那么就说明这样可以。其他情况就都输出 NO ANSWER! 就行了。
在双向搜索的过程中,我们每次选取长度短的字符进行单向搜索判断是否可以和另外一个字符串重合。
大体思路就这些,接下来上代码:
#include<bits/stdc++.h>
#define I using
#define AK namespace
#define IOI std
#define i_ak return
#define ioi 0
#define i_will signed
#define ak main
#define IMO ()
I AK IOI;
string A,B;
vector<pair<string,string> >front,back;
queue<string>st,en;
unordered_map<string,int>sts,ens;
vector<string> ff(const string&s,const string&a,const string&b){
vector<string>res;
if(a.empty())return res;
size_t pos=0;
while(pos<=s.size()-a.size()){
size_t found=s.find(a,pos);
if(found==string::npos)break;
string new_=s.substr(0,found)+b+s.substr(found+a.size());
res.push_back(new_);
pos=found+1;
}
return res;
}
int f(queue<string>&q,unordered_map<string,int>&step,unordered_map<string,int>&step2,vector<pair<string,string>>&r){
int len=q.size();
for(int i=0;i<len;i++){
string s=q.front();
q.pop();
int step_=step[s];
if(step_>=10)continue;
for(auto&it:r){
vector<string>next=ff(s,it.first,it.second);
for(string&it_:next){
if(!step.count(it_)){
step[it_]=step_+1;
q.push(it_);
if(step2.count(it_)){
int tot=step_+1+step2[it_];
if(tot<=10)return tot;
}
}
}
}
}
return -1;
}
void bfs(){
st.push(A);
sts[A]=0;
en.push(B);
ens[B]=0;
int ans=-1;
while(!st.empty()&&!en.empty()){
if(st.size()<=en.size()){
int step=f(st,sts,ens,front);
if(step!=-1){
ans=step;
break;
}
}
else{
int steps=f(en,ens,sts,back);
if(steps!=-1){
ans=steps;
break;
}
}
}
if(ans!=-1&&ans<=10)cout<<ans;
else puts("NO ANSWER!");
}
i_will ak IMO{
cin>>A>>B;
if(A==B){
puts("0");
i_ak ioi;
}
string a,b;
while(cin>>a>>b){
front.push_back({a,b});
back.push_back({b,a});
}
bfs();
i_ak ioi;
}
亲测可过,请勿抄袭!
题解:P1032 [NOIP 2002 提高组] 字串变换的更多相关文章
- NOIP 2002 提高组 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- NOIP 2002提高组 选数 dfs/暴力
1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...
- 1099 字串变换 2002年NOIP全国联赛提高组
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有 ...
- 字串变换 (2002 年NOIP全国联赛提高组)
一道看似非常水的题 大意 :将一个字串 经过几种变换规则变为给定的另一个子串 ,求最小操作数. code[vs] 传送门 洛谷传送门 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): ...
- [NOIP2002] 提高组P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- NOIP 2008提高组第三题题解by rLq
啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2001 提高组 题解
NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- [COGS 0065][NOIP 2002] 字串变换
65. [NOIP2002] 字串变换 ★★ 输入文件:string.in 输出文件:string.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字 ...
随机推荐
- go 限流器 rate
前言 Golang 官方提供的扩展库里就自带了限流算法的实现,即 golang.org/x/time/rate.该限流器也是基于 Token Bucket(令牌桶) 实现的. 限流器的内部结构 tim ...
- vue watch监听路由变化
vue watch监听路由变化 // 监听 this.$route.path // watch监听非DOM元素的改变 watch:{ '$route.path':function(to,from){ ...
- 几个技巧,教你去除文章的 AI 味!
最近有不少朋友在利用 AI 写毕业设计论文,几秒钟一篇文章就刷出来的,爽的飞起. 结果万万没想到,人家论文查重服务也升级了,是不是用 AI 写的论文大概率都能被查出来... 这可如何是好啊?救救我救救 ...
- 卸载和重装docker的方式
查看已安装的版本 yum list installed|grep docker 卸载 [root@localhost ~]# yum -y remove containerd.io.x86_64 [r ...
- 实现领域驱动设计 - 使用ABP框架 - 系列文章汇总
系列文章汇总 前言: 最近看到ABP官网的一本电子书,感觉写的很好,翻译出来,一起学习下 Implementing Domain Driven Design 实现领域驱动设计 - 使用ABP框架 - ...
- Arrays.asList() 详解
[1. 要点] 该方法是将数组转化成List集合的方法. List list = Arrays.asList("a","b","c"); 注 ...
- 汇编概念辨析(Intel/AT&T syntax、GAS、NASM)
写在前面 本文并不详细介绍Intel syntax.AT&T syntax.GAS.NASM的具体内容和具体区别,而是从概念辨析的角度说明这些专有名词的含义,以便为初学者扫清疑惑.有兴趣深入了 ...
- 【网络协议】深入理解HTTP协议
# 协议 协议就是一种双方提前约定好采用某种形式,以某种规格,利用某种物体把数据传输出去:而另一方再以同样的规则和流程去接收数据的约定制度或者规章. 现代网络是由多种运行在不同平台上的异构系统组成的. ...
- Robot Framework绝对路径转相对路径
如上图,添加商品需要上传商品图片,如此,设计脚本时候会填入图片的路径,使自动化能够自动到目的路径内获取图片上传 C:\\Users\\Beckham\\Desktop\\test2\\autoTest ...
- 常用的 JVM 配置参数有哪些?
常用的 JVM 配置参数 JVM 配置参数可以用来控制 Java 程序的内存分配.垃圾回收.性能优化等.以下是一些常用的 JVM 配置参数: 1. 堆内存相关参数 -Xms:设置 JVM 初始堆内存大 ...