[COGS 0065][NOIP 2002] 字串变换
65. [NOIP2002] 字串变换
★★ 输入文件:
string.in
输出文件:string.out
简单对比
时间限制:1 s 内存限制:128 MB[问题描述]
已知有两个字串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!"
[输入样例]
abcd xyz
abc xu
ud y
y yz[输出样例]
3
依然是大力暴搜...
单向 $BFS$ 的话开一个队列, 先把原串怼进去, 然后每次取队首字符串并尝试应用变换规则. 每应用成功一个变换后将变换后的字符串再怼回队列里. 一直重复直至变换得到待求串或者队列为空. 如果队列为空则说明不存在解. 用 $STL$ 里的 $std::string,std::pair,std::map$ 食用即可.
双向 $BFS$ 的话就从两端对称搜索, 但是深度限制在 $10$ 以内可能并不会显得多快OwO...
附双向 $BFS$ 的参考实现:
#include <set>
#include <map>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm> typedef std::pair<std::string,int> pr; int n;
int m;
int ans;
std::string from,to;
std::queue<pr> q1,q2;
std::string transform[][];
std::map<std::string,int> m1,m2;
std::pair<std::string,int> p1,p2; bool Search();
void Initialize();
std::string Replace(std::string,int,int,std::string); int main(){
Initialize();
if(Search())
std::cout<<ans<<std::endl;
else
std::cout<<"NO ANSWER!"<<std::endl;
return ;
} bool Search(){
int len,lenp;
while((!q1.empty())&&(!q2.empty())){
p1=q1.front();
len=p1.first.size();
for(int i=;i<len;i++){
for(int j=;j<m;j++){
lenp=transform[j][].size();
if(i+lenp<=len&&p1.first.compare(i,lenp,transform[j][])==&&m1.count(Replace(p1.first,i,lenp,transform[j][]))==){
p2.first=Replace(p1.first,i,lenp,transform[j][]);
p2.second=q1.front().second+;
if(p2.second>)
return false;
m1[p2.first]=p2.second;
q1.push(p2);
if(m2.count(p2.first)){
ans=p2.second+m2[p2.first];
return true;
}
}
}
}
q1.pop();
p1=q2.front();
len=p1.first.size();
for(int i=;i<len;i++){
for(int j=;j<m;j++){
lenp=transform[j][].size();
if(i+lenp<=len&&p1.first.compare(i,lenp,transform[j][])==&&m2.count(Replace(p1.first,i,lenp,transform[j][]))==){
p2.first=Replace(p1.first,i,lenp,transform[j][]);
p2.second=q2.front().second+;
if(p2.second>)
return false;
m2[p2.first]=p2.second;
q2.push(p2);
if(m1.count(p2.first)){
ans=p2.second+m1[p2.first];
return true;
}
}
}
}
q2.pop();
}
return false;
} void Initialize(){
std::ios::sync_with_stdio(false);
std::cin.tie();
std::cin>>from>>to;
while(std::cin>>transform[m][]>>transform[m][])
m++;
m1[from]=;
m2[to]=;
q1.push(std::make_pair(from,));
q2.push(std::make_pair(to,));
} inline std::string Replace(std::string s, int pos,int len,std::string p){
return s.replace(pos,len,p);
}
Backup
[COGS 0065][NOIP 2002] 字串变换的更多相关文章
- 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs
题目:https://www.luogu.org/problemnew/show/P1032 字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了... #include< ...
- 1099 字串变换 2002年NOIP全国联赛提高组
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有 ...
- NOIP 2002 提高组 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- 字串变换 (2002 年NOIP全国联赛提高组)
一道看似非常水的题 大意 :将一个字串 经过几种变换规则变为给定的另一个子串 ,求最小操作数. code[vs] 传送门 洛谷传送门 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): ...
- 「NOIP2002」「Codevs1099」 字串变换(BFS
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知有两个字串 $A$, ...
- Codevs 1099 字串变换
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有 ...
- 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换
###题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换 ...
- NOIP2002字串变换[BFS]
题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...
- 字串变换(codevs 1099)
题目描述 Description 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ ...
随机推荐
- Delphi下OpenGL2d绘图(06)-画图(多窗口、多视图、多个DC)
一.前言 在学习OpenGL的过程中,发现很多函数都是全局的.前面几章中都是在一个窗口DC中画图,那么要在多个窗口画图,需要怎么处理呢?网上方法有多种,这里采用其中一种,利用wglMakeCurren ...
- 移动端的touchstart,touchmove,touchend事件中的获取当前touch位置
前提:touchstart,touchmove,touchend这三个事件可以通过原生和jq绑定. 原生:document.querySelector("#aa").addEven ...
- 微信WeUI入门2
引入需要的样式文件 最重要的css文件为 weui.min.css 基本的框架如下: <!DOCTYPE html> <html lang="zh-CN"> ...
- Restful的优势
1. 轻量,直接基于http,不在需要任何别的诸如消息协议.get/post/put/delete为CRUD操作2. 面向资源,一目了然,具有自解释性.3. 数据描述简单,一般以xml,json做数据 ...
- github提交代码不用输入账号密码的解决方案
1.在命令行输入命令: git config --global credential.helper store 这一步会在用户目录下的.gitconfig文件最后添加: [credential] he ...
- NSURLSession和NSURLConnection
iOS9.0之后NSURLConnection被注销,采用NSURLSession,先介绍NSURLSession,然后介绍NSURLConnection 1.NSURLSession: post请求 ...
- 二:Bootstrap-css组件
Glyphicons 图标: span.glyphicon glyphicon-align-center 下拉菜单: div.dropdown/div.btn-group button[data-to ...
- Linux安装之后需要进行的一些步骤
查看IP 首先安装后需要查看ip用SSH或者XSHELL来连接Linux,查看ip代码 ifconfig 需要执行 sudo yum install net-tools 命令安装之后 就可以看到ip了 ...
- 线程不安全的类不要轻易做为static变量使用,及如何使用ThreadLocal将共享变量变为独享变量
参考原文:<关于SimpleDateFormat安全的时间格式化线程安全问题>
- kinect 深度图像去噪算法
算法设计思路 (1)读取16位深度图像到待处理图像帧组: (2)ROI区域计算 由于kinect 彩色摄像头和红外深度摄像头是存在视角偏差的,经过视角对齐后,得到的深度图像是有黑边的.此处通过取帧组第 ...