题目描述

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

bfs+hash,我比较蠢,不会STL
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
#define LL long long
const int maxn = ;
int P=;
char s[],t[],len[][],tf[][][];int cnt=,len1,len2;
int mod=,que[maxn],can[maxn],step[maxn];char tmp[maxn][],tt[maxn];
bool vis[];
bool bfs() {
for(int i=;i<len1;++i) tmp[][i]=s[i];
LL h1=;
for(int i=;i<len1;i++) h1=(h1*P+s[i]+mod)%mod;
vis[h1]=;
que[]=len1;
int head=,tail=;
while(head!=tail) {
if(que[head]==len2) {
int p=;
for(int i=;i<len2;++i)
if(tmp[head][i]==t[i])p++;
else break;
if(p==len2) {
printf("%d\n",step[head]);return ;
}
if(step[head]==) return ;
}
for(int i=;i<que[head];++i)
tt[i]=tmp[head][i];
int lenth=que[head];head++;
//printf("%d\n",lenth);
for(int i=;i<lenth;i++) {
for(int j=;j<=cnt;j++) {
if(i+len[j][]>lenth)continue;
int p=;
for(int k=;k<len[j][];k++) {
if(tt[i+k]==tf[j][][k])p++;
else break;
}
//printf("%d\n",p);
if(p==len[j][]) { //can transfrom
for(int k=;k<i;k++)
can[k]=tt[k];
for(int k=;k<len[j][];k++)can[i+k]=tf[j][][k];
for(int k=i+len[j][];k<lenth;k++)
can[k-len[j][]+len[j][]]=tt[k];
que[tail]=lenth-len[j][]+len[j][];
if(que[tail]>)continue;
LL l=;
for(int k=;k<que[tail];++k)
l=(l*P+can[k]+mod)%mod;
if(vis[l])continue;
vis[l]=;
for(int k=;k<que[tail];k++)
tmp[tail][k]=can[k];
step[tail]=step[head-]+;
//printf("%d\n",step[tail]);
tail++;
}
}
}
}
}
int main () {
scanf("%s%s",s,t);
len1=strlen(s);
len2=strlen(t);
while(scanf("%s%s",tf[cnt][],tf[cnt][])!=EOF) {
len[cnt][]=strlen(tf[cnt][]);
len[cnt][]=strlen(tf[cnt][]);
cnt++;
}
//printf("%d\n",cnt);
if(!bfs())
printf("NO ANSWER!\n");
return ;
}

luogu P1032 字串变换的更多相关文章

  1. 洛谷 P1032 字串变换题解

    题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A ...

  2. 洛谷 P1032 字串变换

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

  3. P1032 字串变换 字符串BFS

    题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1​ ->B_1B1​ A_2A2​ -> B_2B2​ 规则的含义为:在 AA中的子串 A_1A1​ ...

  4. [洛谷P1032] 字串变换

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

  5. 【搜索】P1032 字串变换

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

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

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

  7. 洛谷 P1032 字串变换 (BFS)

    题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...

  8. 洛谷 P1032 字串变换 题解

    每日一题 day19 打卡 Analysis 广搜+map判重 用find寻找字串,再用replace替换字串 这里的map相当于正常广搜的一个book的作用 #include<iostream ...

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

    题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...

随机推荐

  1. shell脚本,awk数组之如何处理多个文件。

    [root@localhost | > file [root@localhost - | > file1 [root@localhost awk]# cat file [root@loca ...

  2. 使用CSS来制作类似「黑幕」的效果

    网上几乎没有看到这类的代码,留个档 .heimu,.heimu a{ background-color: #252525; color:#252525; text-shadow: none; }::s ...

  3. verilog behavioral modeling ---Block statements

    block statements : 1. sequential block  : begin-end block 2.parallel block       :  fork - join bloc ...

  4. 元组-tuple

    Python内置的元组数据类型:tuple tuple和list非常类似,但tuple一旦初始化就不能修改,因此它没有append(),insert()这样的方法 当定义一个tuple时,tuple的 ...

  5. django第11天(分页器)

    django第11天分页器 分页模块 批量插入数据 book_list = [] #先生成对象 for i in range(100): book = Book(name = 'book%s'%i,p ...

  6. python爬虫入门四:BeautifulSoup库(转)

    正则表达式可以从html代码中提取我们想要的数据信息,它比较繁琐复杂,编写的时候效率不高,但我们又最好是能够学会使用正则表达式. 我在网络上发现了一篇关于写得很好的教程,如果需要使用正则表达式的话,参 ...

  7. shell-code-exerciese-1

    &&&&&&&&&&&&&&&&&&&& ...

  8. python基础学习笔记——内置函数

    一. 简介 python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:点击查看, 为了方便查看,将内置函数的总结记录下来. 二. 使用说明 以下是Python3版本所有的内 ...

  9. vue 的 scroller 使用

    一 安装 使用npm 安装npm install vue-scroller -d 二 引入 import VueScroller from "vue-scroller" Vue.u ...

  10. C++类设计1(Class without pointer members)

    class complex{ public: complex (double r = 0, double i = 0):re(r), im(i){} //inline complex& ope ...