[COGS 0065][NOIP 2002] 字串变换
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] 字串变换相关推荐
- NOIP 2002 字串变换
题目描述 已知有两个字串A,B,B,B及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A中的子串A1中的子串A1中的子串A1可以变换为 ...
- 1099 字串变换 2002年NOIP全国联赛提高组
1099 字串变换 2002年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 已知有两个字串 A ...
- 广度优先搜索——字串变换(洛谷 P1032)
题目选自洛谷P1032 题意已经把做法写得特别露骨了...最小步数,最多6个变换规则....广搜自不必说,不仅可以寻找解而且还能判断步数(根据广搜首解最优的性质可以得到). 用queue来进行广搜,需 ...
- noip2002 字串变换 (双向宽搜,交替扩展)
P1124字串变换 Accepted 标签:搜索 搜索与剪枝NOIP提高组2002 描述 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -& ...
- P1032 字串变换(bfs)
https://www.luogu.org/problemnew/show/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A 1-> B 1 A 2 ...
- 字串变换(洛谷-P1032)
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- P1032 [NOIP2002 提高组] 字串变换
展开 题目背景 本题疑似错题,不保证存在靠谱的多项式复杂度的做法.测试数据非常的水,各种做法都可以通过,不代表算法正确.因此本题题目和数据仅供参考. 题目描述 已知有两个字串 A,BA,B 及一组字串 ...
- 洛谷P1032字串变换题解--zhengjun
题目描述 已知有两个字串A,BA,BA,B及一组字串变换的规则(至多666个规则): A1A_1A1 −-−> B1B_1B1 A2A_2A2 −-−> B2B_2B2 规则的含义 ...
- 【NOIP 2002】字串变换
NOIP里的恶心题(如果不用stl的话) 然而--stl的话 就成模拟了(本来不是么--) #include <iostream> #include <cstdio> #inc ...
最新文章
- 1015 Reversible Primes
- 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结...
- Java的新项目学成在线笔记-day14(四)
- α稳定分布噪声基本原理及基于Chambers Mallows Stuck算法生成噪声并对信号加噪
- 一个从文本文件里“查找并替换”的功能
- 服务器应用日志清理,Linux下Tomcat日志定期清理
- Error pulling origin: error: The following untracked working tree files would be overwritten by...
- 下docfetcher先下Java,DocFetcher使用教程——高效的文档文本检索工具
- VS2012 有效注册密钥(截止到2016/9/27仍有效)
- 蒙特卡洛模型之神奇的布丰投针实验
- 带你了解锂电池保护板的工作原理
- 论软件系统建模方法及其应用
- 微信如何找到位置服务器,如何查找微信好友的位置?
- [网络安全自学篇] 十.论文之基于机器学习算法的主机恶意代码
- python没有switch case_为什么Python中没有Switch/Case语句?
- TCP/IP、 IXP/SPX、 NetBEUI、 AppleTalk协议
- 一元函数、多元函数的泰勒公式
- Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式
- cf1月24日服务器维护更新公告,VIRUS网游公会[1月24日更新资料]
- java disconnect_Java BlockingConnection.disconnect方法代碼示例
热门文章
- 为什么不用ZK来做服务发现?
- bootcmd和bootargs
- 【Android 修炼手册】Gradle 篇 -- Android Gradle Plugin 主要流程分析
- 如何看待2018年小米雷军98.18亿年薪?
- Devoxx 2017美国大会首日重要演讲一览
- 文件被后台程序占用无法删除_win10重装后系统占用50G?只要做好这2步,运行比win7还快...
- python自动发邮件运行正常就是收不到邮件是为什么_python stmp module 163邮箱发送邮件不成功...
- java中怎么使用json数据_JAVA中使用JSON进行数据传递
- 注释代码c语言,C/C++ 源文件删除注释代码
- GPU Gems2 - 10 动态辐照度环境映射实时计算