「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 ...
随机推荐
- Delphi图像处理 -- 颜色矩阵变换
转载自阿发伯:http://blog.csdn.net/maozefa/article/details/8316430 阅读提示: <Delphi图像处理>系列以效率为侧重点,一般 ...
- CSRF攻击 & XSS攻击
之前有几篇文章写了 SQL注入类问题: http://www.cnblogs.com/charlesblc/p/5987951.html (介绍) http://www.cnblogs.com/cha ...
- [反汇编练习] 160个CrackMe之031
[反汇编练习] 160个CrackMe之031. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- 深入理解Java中的HashMap的实现原理
HashMap继承自抽象类AbstractMap,抽象类AbstractMap实现了Map接口.关系图例如以下所看到的: Java中的Map<key, value>接口同意我们将一个对象作 ...
- Linux图形界面和文字界面的切换
Ctrl+Alt+F1~F6:切换到文字界面 登陆tty1~tty6终端, 运行等级为run level 3 Ctrl+Alt+F7 或者输入命令startX:切换到图形界面,运行等级为run lev ...
- HDU3572Task Schedule(最大流 ISAP比較快)建图方法不错
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- Java数据库访问技术
1.Java集合: Collection Map List: 位于 java.util包中. Arraylist 顺序结构.Linkedlist 链表结构 // List<NewsClassif ...
- 【凯子哥带你夯实应用层】使用ActionProvider实现子菜单时遇到的一个坑
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 近期在重温Android基础.在看到ActionProvider的时候遇到一个坑.分享到大家,避免入坑. 首 ...
- C语言-回溯例4
1,问题提出 日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三国数学教育研讨会上向与会者提出以下填数趣题: 把1,2,...,9这9个数字填入下式的九个方格中(数字不得重复),使下面 ...
- Ansible 汇总
不错的博客:https://www.cnblogs.com/EWWE/p/8146083.html 修改文件权限: 首先需要 vi /etc/ansible/hosts (用pip install, ...