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 ...
随机推荐
- Ibatis入门基本语法
1. Ibatis是开源软件组织Apache推出的一种轻量级的对象关系映射(ORM)框架,和Hibernate.Toplink等在java编程的对象持久化方面深受开发人员欢迎. 对象关系映 ...
- javase(3)_二叉树
// 1.求二叉树中的节点个数 // 2.求二叉树的深度 // 3.前序遍历,中序遍历,后序遍历 // 4.分层遍历二叉树(按层次从上往下,从左往右) // 5.将二叉查找树变为有序的双向链表 // ...
- C# Excel常用控件总结
参考:https://blog.csdn.net/waterstar50/article/details/80590355 1.ClosedXML2.EPPlus 教程:http://www.cnbl ...
- scrollTop如何实现click后页面过渡滚动到顶部
用JS操作,body元素的scrollTop var getTop = document.getElementById("get-top"); var head = documen ...
- cdev_add
初始化 cdev 后,需要把它添加到系统中去.为此可以调用 cdev_add()函数.传入cdev 结构的指针,起始设备编号,以及设备编号范围. 函数首先将分配的设备号与设备数目保存进cdev结构体中 ...
- ORACLE 检索某列包含特定字符串的数据表工具存储过程
使用示例: delete APPS.FIND_RESULT; set serveroutput ondeclare v_ret varchar(200);begin apps.sp_f ...
- 新技术---- MongoDB
MongoDB 在 CentOS7 上安装 MongoDB-------https://www.linuxidc.com/Linux/2016-06/132675.htm Centos7 安装mong ...
- centos 修改时间 计划任务
centos 修改时间 计划任务 一,系统时间修改 1 远程连接到centos 或者直接登录系统 #date 查看系统时间 如下图所示 2 #date -s 修改时间 看下面的例子#date -s ...
- 集群高可用之lvs+keepalive
集群高可用之lvs+keepalive keepalive简介: 负载均衡架构依赖于知名的IPVS内核模块,keepalive由一组检查器根据服务器的健康情况动态维护和管理服务器池.keepalive ...
- Wing IDE 6.0 算号器注册机代码
我开发Python时喜欢用Wing IDE, 然后最近发现Wing IDE升级到6.0版本了, 但是之前能在5.1上用的算号器代码不能用在6.0上了, 所以就上网搜搜是否有相关算号器, 果然, 找到了 ...