P1032 字串变换

蒟蒻的解题报告

P1032 字串变换

题目描述

已知有两个字串 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!”

输入输出样例

输入样例#1:
abcd xyz
abc xu
ud y
y yz
输出样例#1:
3

第一反应是string,然而蒟蒻学艺不精,啥都不会
string 这个博客很不错。

string后就没什么啦,第四个点注意一下,要剪掉一部分

  1. 替换后增加的最短长度*剩余最多步数如果还大于目标长度,剪掉
  2. 替换后增加的最长长度*剩余最多步数如果还小于目标长度,剪掉

贴代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 string ibeg,ifin;
 4 map<string,int>h;
 5 string a[10],b[10];
 6 int la[10],lb[10],mn=0x3f3f3f3f,mx=0,i=1;
 7 void f(string x,int step)
 8 {
 9     if (step>=10) return ;
10     int u=x.size(),v=ifin.size();
11     if (u+mx*(10-step)<v) return ;
12     if (u+mn*(10-step)>v) return ;
13     for (int j=1;j<i;j++) {
14         int pos=x.find(a[j],0);
15         while (pos != string::npos){
16             string tmp=x;
17             tmp.replace(pos,la[j],b[j]);
18             if (( h[tmp]==0 && tmp!=ibeg) || (h[tmp]>h[x]+1) )
19             {
20                 h[tmp]=h[x]+1;
21                 f(tmp,step+1);
22             }
23             pos=x.find(a[j],pos+1);
24         }
25     }
26 }
27 int main()
28 {
29     cin>>ibeg>>ifin;
30     while (cin>>a[i]>>b[i])
31     {
32         la[i]=a[i].size();
33         lb[i]=b[i].size();
34         mn=min(mn,lb[i]-la[i]);
35         mx=max(mx,lb[i]-la[i]);
36         i++;
37     }
38     f(ibeg,0);
39     if ( h[ifin]!=0 ) printf("%d\n",h[ifin]);
40     else printf("NO ANSWER!");
41     return 0;
42 }

代码 C++,1KB
提交时间 2018-01-12 13:52:33
耗时/内存 164ms, 4210KB

原文地址:https://www.cnblogs.com/rtyz/p/8321366.html

时间: 2024-10-10 22:00:07

P1032 字串变换的相关文章

洛谷OJ P1032 字串变换 解题报告

洛谷OJ P1032 字串变换 解题报告 by MedalPluS   [题目描述] 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为:

[NOIP2002] 提高组P1032 字串变换

题目描述 已知有两个字串 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.

洛谷 P1032 字串变换 (BFS)

题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL大法好!虽然也有好多人用了STL,但我个人认为我的更精巧一些(各位dalao不要打我 ~(>_<.)\ ) 用STL实现替换是这样的: string repl(int be,string x,string y,string z) //将字符串x从be位置开始的第一个子串y替换成z,如果子串y不被x

luogu题解P1032字串变换--BFS+STL:string骚操作

题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的string居然变得这么简洁!!! 各种string操作请看另一位大佬博客,写得很全啊: https://www.cnblogs.com/rvalue/p/7327293.html#commentform 其实我们这题只用到两个相关函数:\(S.find(string,pos)\)和\(S.substr()\

洛谷 P1032 字串变换 广搜

这道题原本我用深搜,结果会T,wcnm,然后就直接参考抄题解了 1 Const maxn=10000; 2 maxq=100000; 3 Var a:array[0..1,0..maxn]of string;//变换规则 4 q:array[0..1,0..maxq]of string;//两个队列 5 step:array[0..1,0..maxn]of longint;//步数 6 head,tail:array[0..1]of longint;//两个队列的头指针和尾指针 7 int,ai

NOIP2002 字串变换

题二 字串变换 (存盘名: NOIPG2) [问题描述]: 已知有两个字串 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’->‘x

NOIP2002 字串变换题解(双向搜索)

65. [NOIP2002] 字串变换 时间限制: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$,其变换的过程为: 'abc

[NOIP2002]字串变换 T2 双向BFS

题目描述 已知有两个字串  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'->

codevs1099 字串变换

题目描述 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’-