隐藏页面特效

1099 字串变换

1099 字串变换

 

2002年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 黄金 Gold
 
 
题目描述 Description

已知有两个字串 A,B 及一组字串变换的规则(至多6个规则):
     A1>B1
     A2>B2
  规则的含义为:在 A$中的子串 A1B1、A2B2 …。
    例如:AabcdB='xyz'
  变换规则为:
    ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’

  则此时,AB,其变换的过程为:
   ‘abcd’->‘xud’->‘xy’->‘xyz’

  共进行了三次变换,使得 AB

输入描述 Input Description

输入格式如下:

   AB
   A1B1 \
   A2B2  |-> 变换规则
   ... ... / 
  所有字符串长度的上限为 20。

输出描述 Output Description

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

样例输入 Sample Input

abcd xyz
abc xu
ud y
y yz

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

hehe 

 
题解:

最少步数问题 妥妥的bfs
很显然队列里存的是串(可能存个数也可以 就像8数码那样)
然后每次队首元素弄出来 能换的都换一遍
最后每次换完的新串入队前先判断到头了没
最后说一句 String大法好0.0

ps:最后一个点数据较大,不建议开循环队列。

AC代码:
#include<cstdio> #include<iostream> #include<string> using namespace std; const int N=2e6+10; const int M=11; int step[N]; string a,b,s1[M],s2[M],q[N]; int main(){ int n=1; cin>>a>>b; while(cin>>s1[n]>>s2[n]) n++; n--;//处理变换规则 int h=0,t=1; q[1]=a; while(h<t){ if(step[++h]>10) break; for(int i=1;i<=n;i++){//每一种规则都尝试 反正数据小 for(int j=0;j<q[h].length();j++){//可能有好几个地方可以换 所以枚举一下 if(!q[h].compare(j,s1[i].length(),s1[i])){//如果包含给出的串 q[++t]=q[h]; step[t]=step[h]+1; q[t].replace(j,s1[i].length(),s2[i]);//将找到的字串入队 然后换掉 if(q[t]==b){ cout<<step[t]; return 0; } } } } } cout<<"NO ANSWER!"; return 0; }

 最后一个测试点:

输入数据 (只显示前20行,完整数据请点击上面按钮下载) abaaaba abcdaba a b b d d e e f f g g c 正确答案 8

 


__EOF__

本文作者shenben
本文链接https://www.cnblogs.com/shenben/p/5878923.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   神犇(shenben)  阅读(326)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示