题解: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 [问题描述] 已知有两个字 ...
随机推荐
- docker 配置安装宝塔面板
宝塔镜像 https://hub.docker.com/r/btpanel/baota 配置宝塔 第一步:创建一个名为 bt-data 的目录,此目录将存储宝塔数据. $ mkdir bt-data ...
- helm Error: INSTALLATION FAILED: cannot re-use a name that is still in use
前言 使用helm安装服务报错,修改chat后重新安装报错:安装失败:无法重复使用仍在使用的名称 解决方法 1.查找安装失败的服务 helm -n {namespace} ls -a 2.删除安装失败 ...
- GBJ 97-1987 水泥混凝土路面施工及验收规范(电子版)PDF 版本 下载
本规范适用于新建和改建的公路 城市道路 厂矿道路和民航机场道面等就地浇筑的水泥混凝土路面的施工及验收 链接:https://pan.baidu.com/s/17t88jnEU6IrptmEWsyuN3 ...
- gazebo小车模型(附带仿真环境)
博客地址:https://www.cnblogs.com/zylyehuo/ 参考链接 1.(https://blog.csdn.net/qq_43406338/article/details/109 ...
- HTTP压缩的过程
1. 浏览器发送Http request 给Web服务器, request 中有Accept-Encoding: gzip, deflate.(告诉服务器浏览器支持gzip压缩) 2. Web服 ...
- DVWA靶场实战(十三)——CSP Bypass
DVWA靶场实战(十三) 十三.CSP Bypass: 1.漏洞原理: CSP Bypass全称是Content-Security-Policy,中文叫做绕过内容安全策略.Content-Securi ...
- AspNetCore MVC 跨域
通过XMLHttpRequest或者ajax去请求一个AspNetCore API接口服务时,Firefox提示我 已拦截跨源请求:同源策略禁止读取位于 http://localhost:33694/ ...
- python练习-爬虫(续)
流程: 1 设置url 2 设置消息头 3 设置消息体 4 获取响应 5 解析相应 6 验证数据 接下来就是查询数据了. # 识别图片中的文字 #image = Image.open('captcha ...
- Win10在WSL上使用Vivado对ZCU 102 PYNQ进行ILA调试
ZCU 102上有两个USB接口(接口信号均为micro-A),其中靠近角落的接口为jtag端口,另外一个是uart端口 vivado自带的硬件管理器通过jtag端口连接到开发板.启动开发板,连接开发 ...
- Flutter 2025 年产品路线图发布
每一年 Google Flutter 团队都会发布一份产品路线图,包括 Flutter 框架和 Dart 编程语言,让开发者能够了解官方团队的优先事项,并据此做出自己的计划安排. 产品路线图也会随着客 ...