「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 ...
随机推荐
- Odoo(OpenERP)开发实践:通过XML-RPC接口訪问Odoo数据库
Odoo(OpenERP)server支持通过XML-RPC接口訪问.操作数据库,基于此可实现与其它系统的交互与集成. 本文是使用Java通过XMLRPC接口操作Odoo数据库的简单演示样例.本例引用 ...
- vue-class-component 以class的模式写vue组件
vue英文官网推荐了一个叫vue-class-component的包,可以以class的模式写vue组件.vue-class-component(以下简称Component)带来了很多便利: 1.me ...
- HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))
Drainage Ditches Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- Java数据库访问技术
1.Java集合: Collection Map List: 位于 java.util包中. Arraylist 顺序结构.Linkedlist 链表结构 // List<NewsClassif ...
- Node.js 数据存储方式的选择
如何为你的 Node.js 应用挑选数据库 Node.js 应用一般有三种方式保存数据. 不使用任何数据库管理系统(DBMS),把数据保存在内存里或直接使用文件系统. 使用关系数据库.例如 MySQL ...
- 轻松搞定RabbitMQ(二)——工作队列之消息分发机制
转自 http://blog.csdn.net/xiaoxian8023/article/details/48681987 上一篇博文中简单介绍了一下RabbitMQ的基础知识,并写了一个经典语言入门 ...
- Django-mysq数据库链接问题
Django链接MySQL数据库有可能会报no model named MySQLdb, 解决办法: 首先安装pymysql 然后进入到项目目录,找到__init__.py文件,在里面添加 impor ...
- 你必须了解的java内存管理机制(二)-内存分配
前言 在上一篇文章中,我们花了较大的篇幅去介绍了JVM的运行时数据区,并且重点介绍了栈区的结构及作用,相关内容请猛戳!在本文中,我们将主要介绍对象的创建过程及在堆中的分配方式. 相关链接(注:文章讲解 ...
- stringByAppendingPathComponent和stringByAppendingString 的区别
stringByAppendingPathComponent和stringByAppendingString 的区别 stringByAppendingPathComponent NSString ...
- php逻辑操作符中&和&&的异同
php有5种算术操作符(+ - * / %),6种赋值操作符(+= -= *= /= %= .=),8种比较操作符(=== < > <= >= != <> !==) ...