「NOIP2002」「Codevs1099」 字串变换(BFS
1099 字串变换
2002年NOIP全国联赛提高组
已知有两个字串 $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
题解
这种字符串变换都是考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的更多相关文章
- NOIP2002字串变换[BFS]
题目描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2 ...
- 字串变换 bfs + 字符串
题目描述 已知有两个字串A,BA,BA,B及一组字串变换的规则(至多666个规则): A1A_1A1 ->B1 B_1B1 A2A_2A2 -> B2B_2B2 规则的含义为:在 ...
- luogu题解P1032字串变换--BFS+STL:string骚操作
题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...
- NOIP2002 字串变换题解(双向搜索)
65. [NOIP2002] 字串变换 时间限制:1 s 内存限制:128 MB [问题描述] 已知有两个字串A$, B$及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ ...
- NOIP2002 字串变换
题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为: ...
- 【洛谷1032 】【CJOJ1711】【NOIP2002】字串变换
###题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换 ...
- [NOIP2002]字串变换 T2 双向BFS
题目描述 已知有两个字串 A,B 及一组字串变换的规则(至多6个规则): A1−>B1 A2−>B2 规则的含义为:在 A$中的子串 A1可以变换为可以变换为B1.A2可以变换为可 ...
- 双向BFS—>NOIP2002 字串变换
如果目标也已知的话,用双向BFS能很大提高速度 单向时,是 b^len的扩展. 双向的话,2*b^(len/2) 快了很多,特别是分支因子b较大时 至于实现上,网上有些做法是用两个队列,交替节点搜索 ...
- [NOIP2002] 提高组P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
随机推荐
- 彻底搞懂oracle的标量子查询
oracle标量子查询和自己定义函数有时用起来比較方便,并且开发者也常常使用.数据量小还无所谓.数据量大,往往存在性能问题. 下面測试帮助大家彻底搞懂标量子查询. SQL> create tab ...
- Spring核心(ioc控制反转)
IoC,Inversion Of Control 即控制反转,由容器来管理业务对象之间的依赖关系,而非传统方式中的由代码来管理. 其本质.即将控制权由应用程序代码转到了外部容器,控制权的转移就是 ...
- 从TCP协议的原理来谈谈rst复位攻击
在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接.四次握手如何把全双工的连接关闭掉.滑动窗体是怎么数据传输的.TCP的flag标志位里RST在哪些情况下出现.以下我会画一些尽量简化的 ...
- 找top 10信息
本文章内容来源于<程序猿面试宝典>. 题目: 有1千万条短信,以文本文件的形式保存.一行一条,有反复.请用5分钟时间,找出反复出现最多的前10条. 解析: 某些面试者想用数据库的办法来实现 ...
- Linq实现SQL in
比如 Id in (1,2,3) int[] a={1,2,3}; list.Where(x=>a.Contains(x.Id))
- DM8168 unrecoverable error: OMX_ErrorBadParameter (0x80001005) [resolved]
DM8168 custom board 成功启动系统之后想先測一下8168编解码功能,把开发包里的examples跑一遍.启动完毕后.连上HDMI显示,在starting Matrix GUI app ...
- Unsupported major.minor version (jdk版本错误)解决方案 办法
如果你遇到了 Unsupported major.minor version ,请认真看一下,说不定会有帮助. 我花两个小时总结的经验,你可能10分钟就得到了. ^**^ 一.错误现象: 当改变了jd ...
- Arduino关于旋转编码器程序的介绍(Reading Rotary Encoders)--by Markdown
介绍 旋转或编码器是一个角度測量装置. 他用作精确測量电机的旋转角度或者用来控制控制轮子(能够无限旋转,而电位器只能旋转到特定位置).其中有一些还安装了一个能够在轴上按的button,就像音乐播放器的 ...
- Gson解析数组和list容器
Gson解析数组和list容器 使用Gson解析首先须要增加架包文件:gson-2.2.4.jar 定义一个类Student: public class Student { String name=& ...
- 传统的Java虚拟机和Android的Dalvik虚拟机及其ART模式
Java虚拟机的解释执行引擎称为“基于栈的执行引擎”,其中所指的“栈”就是操作数栈.因此我们也称Java虚拟机是基于栈的,这点不同于Android虚拟机,Android虚拟机是基于寄存器的. 基于栈的 ...