luogu 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!"
输入输出样例
abcd xyz
abc xu
ud y
y yz
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 字串变换的更多相关文章
- 洛谷 P1032 字串变换题解
题目链接:https://www.luogu.org/problem/P1032 题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A ...
- 洛谷 P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- P1032 字串变换 字符串BFS
题目描述 已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则): A_1A1 ->B_1B1 A_2A2 -> B_2B2 规则的含义为:在 AA中的子串 A_1A1 ...
- [洛谷P1032] 字串变换
洛谷题目链接:字串变换 题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B ...
- 【搜索】P1032 字串变换
题目描述 已知有两个字串A,B及一组字串变换的规则(至多6个规则): A1 ->B1 A2 -> B2 规则的含义为:在 A中的子串 A1 可以变换为B1,A2 可以变换为 ...
- [NOIP2002] 提高组P1032 字串变换
题目描述 已知有两个字串 A, B 及一组字串变换的规则(至多6个规则): A1 -> B1 A2 -> B2 规则的含义为:在 A$中的子串 A1 可以变换为 B1.A2 可以变换为 B ...
- 洛谷 P1032 字串变换 (BFS)
题目传送门 我即使是死了,钉在棺材里了,也要在墓里,用这腐朽的声带喊出 STL大法好 这题最麻烦的其实是处理字符串,真正的搜索部分我个人认为也就只有橙题或黄题的难度.而处理字符串,正如前面所说,STL ...
- 洛谷 P1032 字串变换 题解
每日一题 day19 打卡 Analysis 广搜+map判重 用find寻找字串,再用replace替换字串 这里的map相当于正常广搜的一个book的作用 #include<iostream ...
- luogu题解P1032字串变换--BFS+STL:string骚操作
题目链接 https://www.luogu.org/problemnew/show/P1032 分析 这题本来很裸的一个BFS,发现其中的字符串操作好烦啊.然后就翻大佬题解发现用STL中的strin ...
随机推荐
- shell脚本,awk数组之如何处理多个文件。
[root@localhost | > file [root@localhost - | > file1 [root@localhost awk]# cat file [root@loca ...
- 使用CSS来制作类似「黑幕」的效果
网上几乎没有看到这类的代码,留个档 .heimu,.heimu a{ background-color: #252525; color:#252525; text-shadow: none; }::s ...
- verilog behavioral modeling ---Block statements
block statements : 1. sequential block : begin-end block 2.parallel block : fork - join bloc ...
- 元组-tuple
Python内置的元组数据类型:tuple tuple和list非常类似,但tuple一旦初始化就不能修改,因此它没有append(),insert()这样的方法 当定义一个tuple时,tuple的 ...
- django第11天(分页器)
django第11天分页器 分页模块 批量插入数据 book_list = [] #先生成对象 for i in range(100): book = Book(name = 'book%s'%i,p ...
- python爬虫入门四:BeautifulSoup库(转)
正则表达式可以从html代码中提取我们想要的数据信息,它比较繁琐复杂,编写的时候效率不高,但我们又最好是能够学会使用正则表达式. 我在网络上发现了一篇关于写得很好的教程,如果需要使用正则表达式的话,参 ...
- shell-code-exerciese-1
&&&&&&&&&&&&&&&&&&&& ...
- python基础学习笔记——内置函数
一. 简介 python内置了一系列的常用函数,以便于我们使用,python英文官方文档详细说明:点击查看, 为了方便查看,将内置函数的总结记录下来. 二. 使用说明 以下是Python3版本所有的内 ...
- vue 的 scroller 使用
一 安装 使用npm 安装npm install vue-scroller -d 二 引入 import VueScroller from "vue-scroller" Vue.u ...
- C++类设计1(Class without pointer members)
class complex{ public: complex (double r = 0, double i = 0):re(r), im(i){} //inline complex& ope ...