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$ 的参考实现:

GitHub

 #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] 字串变换的更多相关文章

  1. 洛谷 P1032 [ NOIP 2002 ] 字串变换 —— 字符串+bfs

    题目:https://www.luogu.org/problemnew/show/P1032 字符串好复杂...先写了个 dfs ,RE一个点TLE一个点,不知该怎么改了... #include< ...

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

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

  3. NOIP 2002 提高组 字串变换

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

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

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

  5. 「NOIP2002」「Codevs1099」 字串变换(BFS

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

  6. Codevs 1099 字串变换

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

  7. 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换

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

  8. NOIP2002字串变换[BFS]

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

  9. 字串变换(codevs 1099)

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

随机推荐

  1. Delphi下OpenGL2d绘图(06)-画图(多窗口、多视图、多个DC)

    一.前言 在学习OpenGL的过程中,发现很多函数都是全局的.前面几章中都是在一个窗口DC中画图,那么要在多个窗口画图,需要怎么处理呢?网上方法有多种,这里采用其中一种,利用wglMakeCurren ...

  2. 移动端的touchstart,touchmove,touchend事件中的获取当前touch位置

    前提:touchstart,touchmove,touchend这三个事件可以通过原生和jq绑定. 原生:document.querySelector("#aa").addEven ...

  3. 微信WeUI入门2

    引入需要的样式文件 最重要的css文件为 weui.min.css 基本的框架如下: <!DOCTYPE html> <html lang="zh-CN"> ...

  4. Restful的优势

    1. 轻量,直接基于http,不在需要任何别的诸如消息协议.get/post/put/delete为CRUD操作2. 面向资源,一目了然,具有自解释性.3. 数据描述简单,一般以xml,json做数据 ...

  5. github提交代码不用输入账号密码的解决方案

    1.在命令行输入命令: git config --global credential.helper store 这一步会在用户目录下的.gitconfig文件最后添加: [credential] he ...

  6. NSURLSession和NSURLConnection

    iOS9.0之后NSURLConnection被注销,采用NSURLSession,先介绍NSURLSession,然后介绍NSURLConnection 1.NSURLSession: post请求 ...

  7. 二:Bootstrap-css组件

    Glyphicons 图标: span.glyphicon glyphicon-align-center 下拉菜单: div.dropdown/div.btn-group button[data-to ...

  8. Linux安装之后需要进行的一些步骤

    查看IP 首先安装后需要查看ip用SSH或者XSHELL来连接Linux,查看ip代码 ifconfig 需要执行 sudo yum install net-tools 命令安装之后 就可以看到ip了 ...

  9. 线程不安全的类不要轻易做为static变量使用,及如何使用ThreadLocal将共享变量变为独享变量

    参考原文:<关于SimpleDateFormat安全的时间格式化线程安全问题>

  10. kinect 深度图像去噪算法

    算法设计思路 (1)读取16位深度图像到待处理图像帧组: (2)ROI区域计算 由于kinect 彩色摄像头和红外深度摄像头是存在视角偏差的,经过视角对齐后,得到的深度图像是有黑边的.此处通过取帧组第 ...