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. Odoo(OpenERP)开发实践:通过XML-RPC接口訪问Odoo数据库

    Odoo(OpenERP)server支持通过XML-RPC接口訪问.操作数据库,基于此可实现与其它系统的交互与集成. 本文是使用Java通过XMLRPC接口操作Odoo数据库的简单演示样例.本例引用 ...

  2. vue-class-component 以class的模式写vue组件

    vue英文官网推荐了一个叫vue-class-component的包,可以以class的模式写vue组件.vue-class-component(以下简称Component)带来了很多便利: 1.me ...

  3. HDU1532_Drainage Ditches(网络流/EK模板/Dinic模板(邻接矩阵/前向星))

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. Java数据库访问技术

    1.Java集合: Collection Map List: 位于 java.util包中. Arraylist 顺序结构.Linkedlist 链表结构 // List<NewsClassif ...

  5. Node.js 数据存储方式的选择

    如何为你的 Node.js 应用挑选数据库 Node.js 应用一般有三种方式保存数据. 不使用任何数据库管理系统(DBMS),把数据保存在内存里或直接使用文件系统. 使用关系数据库.例如 MySQL ...

  6. 轻松搞定RabbitMQ(二)——工作队列之消息分发机制

    转自 http://blog.csdn.net/xiaoxian8023/article/details/48681987 上一篇博文中简单介绍了一下RabbitMQ的基础知识,并写了一个经典语言入门 ...

  7. Django-mysq数据库链接问题

    Django链接MySQL数据库有可能会报no model named MySQLdb, 解决办法: 首先安装pymysql 然后进入到项目目录,找到__init__.py文件,在里面添加 impor ...

  8. 你必须了解的java内存管理机制(二)-内存分配

    前言 在上一篇文章中,我们花了较大的篇幅去介绍了JVM的运行时数据区,并且重点介绍了栈区的结构及作用,相关内容请猛戳!在本文中,我们将主要介绍对象的创建过程及在堆中的分配方式. 相关链接(注:文章讲解 ...

  9. stringByAppendingPathComponent和stringByAppendingString 的区别

    stringByAppendingPathComponent和stringByAppendingString 的区别   stringByAppendingPathComponent NSString ...

  10. php逻辑操作符中&和&&的异同

    php有5种算术操作符(+ - * / %),6种赋值操作符(+= -= *= /= %= .=),8种比较操作符(=== < > <= >= != <> !==) ...