题目链接: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 提高组] 字串变换的更多相关文章

  1. NOIP 2002 提高组 字串变换

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

  2. NOIP 2002提高组 选数 dfs/暴力

    1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...

  3. 1099 字串变换 2002年NOIP全国联赛提高组

    1099 字串变换 2002年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知有 ...

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

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

  5. [NOIP2002] 提高组P1032 字串变换

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

  6. NOIP 2008提高组第三题题解by rLq

    啊啊啊啊啊啊今天已经星期三了吗 那么,来一波题解吧 本题地址http://www.luogu.org/problem/show?pid=1006 传纸条 题目描述 小渊和小轩是好朋友也是同班同学,他们 ...

  7. NOIP 2014 提高组 题解

    NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...

  8. NOIP 2001 提高组 题解

    NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...

  9. 洛谷 P1032 字串变换题解

    题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A ...

  10. [COGS 0065][NOIP 2002] 字串变换

    65. [NOIP2002] 字串变换 ★★   输入文件:string.in   输出文件:string.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字 ...

随机推荐

  1. helm install 从多种源进行安装

    Helm 提供了多种方法来从不同的源安装 charts.以下是一些常见的安装方法: Helm官方仓库 从 Helm 官方仓库(Helm Hub)安装:Helm Hub 是 Helm 官方维护的一个公共 ...

  2. 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案

    AI教父辛顿说DeepSeek允许本地部署的话可能会导致用户用DeepSeek来做一些危险的事情(https://t.cj.sina.com.cn/articles/view/7879923924/m ...

  3. git和github的入门操作

    之前因为工作中用的都是SVN版本控制工具,没接触过git和github,现在开始深入自学Django框架技术后,看到官网推荐使用git,然后这两天网上查阅了很多文章教程,学到入门操作需要学习的点,太多 ...

  4. jupyterhub nginx proxy pass----ipv6转ipv4实现内网穿透

    jupyterhub 很多人应该已经对jupyter和notebook已经有所了解了.如果是多人共享服务器的话,就需要用到jupyter的多用户版本jupyterhub.jupyterhub架构如图所 ...

  5. 关于oracle pfile和spfile文件说明

    •Pfile(Parameter File,参数文件):是基于文本格式的参数文件,含有数据库的配置参数. 默认的名称为"init+例程名.ora",这是一个文本文件,可以用任何文本 ...

  6. [每日算法 - 华为机试] LeetCode1160. 拼写单词

    题目入口 力扣https://leetcode.cn/problems/find-words-that-can-be-formed-by-characters/ 题目概述 给你一份『词汇表』(字符串数 ...

  7. 【Linux】5.9 Shell函数

    Shell 函数 1. 自定义函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] ...

  8. 【SpringCloud】Zookeeper服务注册与发现

    Zookeeper服务注册与发现 Eureka停止更新了,你怎么办 https://github.com/Netflix/eureka/wiki SpringCloud整合Zookeeper替代Eur ...

  9. Web前端入门第 29 问:CSS 盒模型:网页布局的基石

    在 Web 网页开发中,盒模型(Box Model) 是 CSS 的核心概念,它决定了每个 HTML 元素在页面中占据的空间和布局方式. 无论是文本.图片还是按钮,浏览器都会将它们视为一个矩形盒子,并 ...

  10. 使用Python+SymPy求解微分方程

    引言 在学习微积分或者物理.工程相关的学科时,微分方程常常是我们需要解决的一个重要问题.微分方程是包含未知函数及其导数的方程,广泛应用于描述变化过程中的规律,如物理中的运动方程.化学中的反应速率.经济 ...