1099 字串变换

2002年NOIP全国联赛提高组

时间限制: 1 s
空间限制: 128000 KB
题目等级 : 黄金 Gold
 
题目描述 Description

已知有两个字串 $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$。

输入描述
Input Description

输入格式如下:

   $A$ $B$
   $A1$ $B1$ \
   $A2$ $B2$  |-> 变换规则
   ... ... / 
  所有字符串长度的上限为 20。

输出描述
Output Description

若在 10 步(包含 10步)以内能将 $A$ 变换为 $B$ ,则输出最少的变换步数;否则输出"NO ANSWER!"

样例输入
Sample Input

abcd xyz
abc xu
ud y
y yz

样例输出
Sample Output

3

数据范围及提示
Data Size & Hint

hehe


题解

教材(来自Luogu的题解

这种字符串变换都是考STL的使用啊!!!QAQ

前置知识:

1.map入门:

定义:
map<type1,type2>mp;
相当于一个用type1当下标的数组。
eg:
map<double,int>mp;
mp[2.6]=;
cout<<mp[2.6];
//输出3 查找:
直接向数组一样访问就行了,但是要先问一下是否存在。
if(mp.find(x)==mp.end())表示这个下标没有存过。 然后map的各种操作应该(应该?)都是O(log)的。

2.string相关:

定义:
string a;
//可以定义字符串数组 访问其中下标为i的字母:
int k=a[i];
//注意是从0开始排的 在string a里面找子串b
int pos=a.find(b);
//如果存在子串b 返回b的第一个字符对应在a里面的下标(若有多个匹配,返回第一个匹配的下标) 否则返回-1 (划重点)
把string a从pos开始长l的字符整体换成字串b
a.replace(pos,l+,b);
//stl的区间都是左开右闭的

然后就可以乱搞了,BFS一下就星。

这个st.replace可以再神奇一点吗?!!!!!

 /*
qwerta
P1032 字串变换
Accepted
100
代码 C++,1.14KB
提交时间 2018-09-26 19:13:29
耗时/内存
26ms, 1432KB
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#include<map>
using namespace std;
string a[],b[];
string ma,mb;
queue<string>qs;//存字符串
queue<int>qn;//存对应的转换次数
int n=;
map<string,int>m;
int bfs()
{
qs.push(ma);//push初始状态
qn.push();
while(!qs.empty()&&qn.front()<)//如果有的搜并且次数不超过10
{
int d=qn.front();
string s=qs.front();
if(m.find(s)==m.end())//如果s在map中没有被记录过
{
m[s]=;//mark一下
for(int c=;c<=n;++c)//枚举六种变换
{
s=qs.front();
while((s.find(a[c]))!=-)//如果找得到子串a[c]
{
string ss=qs.front();//搞一个辅助的ss
int pos=s.find(a[c]);
ss.replace(pos,a[c].size(),b[c]);//把ss替换一下
if(ss==mb)return d+;//找到了就return
qs.push(ss);
qn.push(d+);//push当前的收获
s[pos]='*';//把s的这一位换成无关字符,这样下一次就会自动搜下一位了
}
}
}
qs.pop();qn.pop();
}
return -;//搜完了还没搜到则无解
}
int main()
{
//freopen("a.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(false),cout.tie(false);//cin好伴侣(据说能快过scanf
cin>>ma>>mb;
while(cin>>a[n]>>b[n])n++;
n--;
int k=bfs();
if(k==-){cout<<"NO ANSWER!";}
else cout<<k;
return ;
}

不用map判重也不会TLE 差评

不用map:
/*
qwerta
P1032 字串变换
Accepted
100
代码 C++,1.14KB
提交时间 2018-09-26 19:14:03
耗时/内存
389ms, 64472KB
*/
//(摔

「NOIP2002」「Codevs1099」 字串变换(BFS的更多相关文章

  1. NOIP2002字串变换[BFS]

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

  2. 字串变换 bfs + 字符串

    题目描述 已知有两个字串A,BA,BA,B及一组字串变换的规则(至多666个规则): A1A_1A1​ ->B1 B_1B1​ A2A_2A2​ -> B2B_2B2​ 规则的含义为:在 ...

  3. luogu题解P1032字串变换--BFS+STL:string骚操作

    题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...

  4. NOIP2002 字串变换题解(双向搜索)

    65. [NOIP2002] 字串变换 时间限制:1 s   内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...

  5. NOIP2002 字串变换

    题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...

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

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

  7. [NOIP2002]字串变换 T2 双向BFS

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

  8. 双向BFS—>NOIP2002 字串变换

    如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2)  快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...

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

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

随机推荐

  1. [反汇编练习] 160个CrackMe之032

    [反汇编练习] 160个CrackMe之032. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  2. mySql 主从复制linux配置

    总结: 主库(192.168.1.251): /etc/my.cnf.d/server.cnf [mysqld] log-bin=mysql-bin server-id=1 从库(192.168.1. ...

  3. Solidworks安装完成提示failed to load slderresu.dll怎么办

    安装完成出现下面的一系列错误提示   进入到语言包,重新安装中文语言包即可   可以正常打开和运行了                  

  4. ASP.NET MVC Filters 4种默认过滤器的使用【附示例】 数据库常见死锁原因及处理 .NET源码中的链表 多线程下C#如何保证线程安全? .net实现支付宝在线支付 彻头彻尾理解单例模式与多线程 App.Config详解及读写操作 判断客户端是iOS还是Android,判断是不是在微信浏览器打开

    ASP.NET MVC Filters 4种默认过滤器的使用[附示例]   过滤器(Filters)的出现使得我们可以在ASP.NET MVC程序里更好的控制浏览器请求过来的URL,不是每个请求都会响 ...

  5. 函数指针使用演示样例(參考Linux-内核代码)

    本文有xhz1234(徐洪志)编写,转载请注明出处. http://blog.csdn.net/xhz1234/article/details/36635083 作者:徐洪志 近期阅读Linux-内核 ...

  6. css实现轮播效果图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 详谈kubernetes更新-2

    系列目录 本文详细探索deployment在滚动更新时候的行为 要详细探讨的参数描述: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪性探测.判断p ...

  8. 【CUDA】CUDA开发环境搭建

    http://blog.csdn.net/tracer9/article/details/50484764 标签: CUDA并行计算NVIDIAlinux 2016-01-08 18:35 637人阅 ...

  9. MyBatis学习(一):简单的运行

    1.准备工作 jar包: mybatis-3.4.4.jar,下载地址:https://github.com/mybatis/ignite-cache/releases mysql-connector ...

  10. 腾讯云ubuntu memcached 安装

    ubuntu安装 sudo apt-get install  memcached 停止memcached服务:sudo systemctl stop memcached 激活memcached服务:s ...