65. [NOIP2002] 字串变换

★★   输入文件:string.in   输出文件:string.out   简单对比
时间限制:1 s   内存限制:128 MB

[问题描述]

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

[输入]

A\$ B\$

A1\$ B1\$

A2\$ B2\$  |->变换规则

... ... /

所有字符串长度的上限为20。

[输出]

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

[输入样例]

abcd xyz
abc xu
ud y
y yz

[输出样例]

3

依然是大力暴搜...

单向 $BFS$ 的话开一个队列, 先把原串怼进去, 然后每次取队首字符串并尝试应用变换规则. 每应用成功一个变换后将变换后的字符串再怼回队列里. 一直重复直至变换得到待求串或者队列为空. 如果队列为空则说明不存在解. 用 $STL$ 里的 $std::string,std::pair,std::map$ 食用即可.

双向 $BFS$ 的话就从两端对称搜索, 但是深度限制在 $10$ 以内可能并不会显得多快OwO...

附双向 $BFS$ 的参考实现:

GitHub

 1 #include <set>
 2 #include <map>
 3 #include <queue>
 4 #include <cstdio>
 5 #include <string>
 6 #include <cstring>
 7 #include <cstdlib>
 8 #include <iostream>
 9 #include <algorithm>
10
11 typedef std::pair<std::string,int> pr;
12
13 int n;
14 int m;
15 int ans;
16 std::string from,to;
17 std::queue<pr> q1,q2;
18 std::string transform[10][2];
19 std::map<std::string,int> m1,m2;
20 std::pair<std::string,int> p1,p2;
21
22 bool Search();
23 void Initialize();
24 std::string Replace(std::string,int,int,std::string);
25
26 int main(){
27     Initialize();
28     if(Search())
29         std::cout<<ans<<std::endl;
30     else
31         std::cout<<"NO ANSWER!"<<std::endl;
32     return 0;
33 }
34
35 bool Search(){
36     int len,lenp;
37     while((!q1.empty())&&(!q2.empty())){
38         p1=q1.front();
39         len=p1.first.size();
40         for(int i=0;i<len;i++){
41             for(int j=0;j<m;j++){
42                 lenp=transform[j][0].size();
43                 if(i+lenp<=len&&p1.first.compare(i,lenp,transform[j][0])==0&&m1.count(Replace(p1.first,i,lenp,transform[j][1]))==0){
44                     p2.first=Replace(p1.first,i,lenp,transform[j][1]);
45                     p2.second=q1.front().second+1;
46                     if(p2.second>10)
47                         return false;
48                     m1[p2.first]=p2.second;
49                     q1.push(p2);
50                     if(m2.count(p2.first)){
51                         ans=p2.second+m2[p2.first];
52                         return true;
53                     }
54                 }
55             }
56         }
57         q1.pop();
58         p1=q2.front();
59         len=p1.first.size();
60         for(int i=0;i<len;i++){
61             for(int j=0;j<m;j++){
62                 lenp=transform[j][1].size();
63                 if(i+lenp<=len&&p1.first.compare(i,lenp,transform[j][1])==0&&m2.count(Replace(p1.first,i,lenp,transform[j][0]))==0){
64                     p2.first=Replace(p1.first,i,lenp,transform[j][0]);
65                     p2.second=q2.front().second+1;
66                     if(p2.second>10)
67                         return false;
68                     m2[p2.first]=p2.second;
69                     q2.push(p2);
70                     if(m1.count(p2.first)){
71                         ans=p2.second+m1[p2.first];
72                         return true;
73                     }
74                 }
75             }
76         }
77         q2.pop();
78     }
79     return false;
80 }
81
82 void Initialize(){
83     std::ios::sync_with_stdio(false);
84     std::cin.tie(0);
85     std::cin>>from>>to;
86     while(std::cin>>transform[m][0]>>transform[m][1])
87         m++;
88     m1[from]=0;
89     m2[to]=0;
90     q1.push(std::make_pair(from,0));
91     q2.push(std::make_pair(to,0));
92 }
93
94 inline std::string Replace(std::string s, int pos,int len,std::string p){
95     return s.replace(pos,len,p);
96 }

Backup

转载于:https://www.cnblogs.com/rvalue/p/7308487.html

[COGS 0065][NOIP 2002] 字串变换相关推荐

  1. NOIP 2002 字串变换

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

  2. 1099 字串变换 2002年NOIP全国联赛提高组

    1099 字串变换 2002年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解 题目描述 Description 已知有两个字串 A ...

  3. 广度优先搜索——字串变换(洛谷 P1032)

    题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...

  4. noip2002 字串变换 (双向宽搜,交替扩展)

    P1124字串变换 Accepted 标签:搜索 搜索与剪枝NOIP提高组2002 描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -& ...

  5. P1032 字串变换(bfs)

    https://www.luogu.org/problemnew/show/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A 1-> B 1 A 2 ...

  6. 字串变换(洛谷-P1032)

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

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

    展开 题目背景 本题疑似错题,不保证存在靠谱的多项式复杂度的做法.测试数据非常的水,各种做法都可以通过,不代表算法正确.因此本题题目和数据仅供参考. 题目描述 已知有两个字串 A,BA,B 及一组字串 ...

  8. 洛谷P1032字串变换题解--zhengjun

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

  9. 【NOIP 2002】字串变换

    NOIP里的恶心题(如果不用stl的话) 然而--stl的话 就成模拟了(本来不是么--) #include <iostream> #include <cstdio> #inc ...

最新文章

  1. 1015 Reversible Primes
  2. 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结...
  3. Java的新项目学成在线笔记-day14(四)
  4. α稳定分布噪声基本原理及基于Chambers Mallows Stuck算法生成噪声并对信号加噪
  5. 一个从文本文件里“查找并替换”的功能
  6. 服务器应用日志清理,Linux下Tomcat日志定期清理
  7. Error pulling origin: error: The following untracked working tree files would be overwritten by...
  8. 下docfetcher先下Java,DocFetcher使用教程——高效的文档文本检索工具
  9. VS2012 有效注册密钥(截止到2016/9/27仍有效)
  10. 蒙特卡洛模型之神奇的布丰投针实验
  11. 带你了解锂电池保护板的工作原理
  12. 论软件系统建模方法及其应用
  13. 微信如何找到位置服务器,如何查找微信好友的位置?
  14. [网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
  15. python没有switch case_为什么Python中没有Switch/Case语句?
  16. TCP/IP、 IXP/SPX、 NetBEUI、 AppleTalk协议
  17. 一元函数、多元函数的泰勒公式
  18. Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式
  19. cf1月24日服务器维护更新公告,VIRUS网游公会[1月24日更新资料]
  20. java disconnect_Java BlockingConnection.disconnect方法代碼示例

热门文章

  1. 为什么不用ZK来做服务发现?
  2. bootcmd和bootargs
  3. 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要流程分析
  4. 如何看待2018年小米雷军98.18亿年薪?
  5. Devoxx 2017美国大会首日重要演讲一览
  6. 文件被后台程序占用无法删除_win10重装后系统占用50G?只要做好这2步,运行比win7还快...
  7. python自动发邮件运行正常就是收不到邮件是为什么_python stmp module 163邮箱发送邮件不成功...
  8. java中怎么使用json数据_JAVA中使用JSON进行数据传递
  9. 注释代码c语言,C/C++ 源文件删除注释代码
  10. GPU Gems2 - 10 动态辐照度环境映射实时计算