题目描述

已知有两个字串 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. Python、机器学习、计算机视觉、深度学习入门

    1.简明Python教程 2.Python计算机视觉编程 3.机器学习实践 4.吴恩达机器学习 5.李飞飞深度学习与计算机视觉

  2. Django ORM操作及进阶

    一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...

  3. codeforces Lightsabers (hard)

    题目大意: 给定每种球的数量,求从中选取k个球有多少种不同的取法,同种球视为相同的. 题解: 多项式(1+x+x^2+...+x^a[1])*(1+x+x^2+...+x^a[2])*(1+x+x^2 ...

  4. POJ 1160 四边形不等式优化DP Post Office

    d(i, j)表示用i个邮局覆盖前j个村庄所需的最小花费 则有状态转移方程:d(i, j) = min{ d(i-1, k) + w(k+1, j) } 其中w(i, j)的值是可以预处理出来的. 下 ...

  5. 【SaltStack】一些常用模块举例

    一.用户和用户组模块 说明:该sls文件用来在Minion端创建nginx用户和nginx用户组,当创建nginx用户时,对nginx用户组是否已存在做判断! (1)  /srv/salt/creat ...

  6. [转]Mac屏幕录像转成gif

    http://note.axiaoxin.com/contents/mac-video2gif.html 屏幕录像 打开Quicktime Player -> 文件 -> 新建屏幕录像 - ...

  7. JSPatch部署JS代码控制OC代码

    前言: 这里算是比较实用的一篇了吧,进行了网络安全部署 准备: bmob账号,JSPatch,公钥,私钥,MD5加密,AFNetWorking下载文件 #import <CommonCrypto ...

  8. haskell 乱搞(2)之 Y-conbinator [原创]

    Y-conbinator"有没有用"?并没有,在大多数支持函数式编程的语言里,你可以自由的使用递归,而这货只是作为理论基石弥散在函数式编程的血肉之中 这是数学笔记,这是数学笔记,这 ...

  9. 【双向bfs】2017多校训练十 HDU 6171 Admiral

    [题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...

  10. Java 学习(3):java 对象和类

    目录: --- 对象 --- 类 --- 源文件的声明规则 --- Java 包 对象: 对象是类的一个实例(对象不是找个女朋友),有状态和行为.例如,一条狗是一个对象,它的状态有:颜色.名字.品种: ...