[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$ ...
随机推荐
- APU (美国AMD公司研发的加速处理器)
APU(Accelerated Processing Unit)中文名字叫加速处理器,是AMD“融聚未来”理念的产品,它第一次将中央处理器和独显核心做在一个晶片上,它同时具有高性能处理器和最新独立显卡 ...
- WebStorm配置Node.js IDE
开始刚学的时候一直用命令行来运行Node.js,网上找了些配置Node.js IDE配置的贴子,说WebStorm配置IDE最简单,自己就试了下. 1.首先安装Node这步就不说了 2.下载WebSt ...
- 引入第三方js文件,报错
错误:Mixed Content: The page at 'https://localhost:44336/MENU' was loaded over HTTPS, but requested an ...
- JSP9大内置对象
JSP9大内置对象 JSP9个内置对象:out对象 用于输出各种数据reuest对象 封装了来自客户端的各种信息response对象 封装了服务器的响应信息exception对象 封装了程序运行过程中 ...
- 从JSON中读取数据追加到HTML中
本文来自https://www.jianshu.com/p/04127d74d88c,并非本人原创,只是作为自己学习使用的资料,如有浏览者请点击地址自行到原作者页面浏览 有时候我们需要将json数据直 ...
- 搞懂WebSocket原理
一.websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算) 首先HTTP有 1 ...
- 关于npm构建angular2项目问题
我在win10系统下用npm构建好angular2项目之后,在命令行下运行 ng serve --open,报一下错误: Unknown browser query 'basedir=$(dirnam ...
- Spring Data MongoDB 模糊查询
Pattern pattern = Pattern.compile("^.*" + value + ".*$"); Query query = new Quer ...
- QT开发(一)Vs2013集成 QT5.3.1
原文:http://www.cnblogs.com/aoldman/p/3860837.html 很久不写随笔了,真是越来越懒.最近公司要做一款产品,想使用QT不用WPF lol,让苦逼的.net的我 ...
- Visual Studio解决方案vs2005/vs2008/vs2010/vs2012/vs2013/vs2015版本互相转换工具
原文:http://blog.csdn.net/xiejiashu/article/details/52397641 本文转自EasyDarwin团队成员Alex的博客:http://blog.c ...