字串变换(AcWing, NOIP2002提高组)

题目描述:

题目链接: 

https://www.acwing.com/problem/content/192/

思路:

这个题是要求“最小步数”,比较容易想到是用BFS来进行搜索,但是直接BFS的话状态数太多了,时间复杂度会到:O((LN)^{10}),其中L是字符串的长度,N是一个字符串的可能变换到的后继字符串数。肯定会超时。

因此,本题使用了“双向搜索”的技巧,i.e. 分别从起点和终点向中间进行搜索,如果搜到了“公共点”,那这个公共点就是答案。 使用双向搜索的时间复杂度是:O(2(LN)^{5})

在具体实现的时候,使用了一些实现技巧(需要注意!):

1. 优先从队列比较小的那个方向进行搜索

2. 当一个方向搜索完了,还没有搜到和另一个方向的公共点时,就直接结束,此时一定无解了! 这是因为: 不妨假设是正向搜索完了,还没有搜到与另一个方向的公共点。注意到我们的“双向搜索”本质上和“单向搜索”的答案(有解性)应当是相同的。而如果只用“单向搜索”搜不到答案,那么双向搜索也一定搜不到答案(反证法可证),而现在“正向搜索”搜完了,这实际上相当于“单向搜索”搜索完了,也没搜到答案,因此“双向搜索”就没有必要继续进行下去了,因为一定不会有答案了。

3. 使用了string 类的substr来完成取子串,string类的+ 来实现字符串拼接, string类的=来实现字符串相等的判断

4. 使用unordered_map,不用map, 这样会更快

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<unordered_map>
#include<algorithm>
using namespace std;
const int N=7;
queue<string> qa,qb;
string a[N],b[N];
unordered_map<string,int> ma,mb;
string A,B;
int n;

int extend(string cur,int flag){
	if(flag==0){
		for(int i=0;i<cur.size();i++){
			for(int j=1;j<=n;j++){
				if(cur.substr(i,a[j].size())==a[j]){
					string tmp;
					tmp=cur.substr(0,i)+b[j]+cur.substr(i+a[j].size());
					if(mb[tmp]){
						int res=mb[tmp]-1+ma[cur];
						return res;
					}
					if(ma[tmp]) continue;
					ma[tmp]=ma[cur]+1;
					qa.push(tmp);
				}
			}
		}
	}
	else{
		for(int i=0;i<cur.size();i++){
			for(int j=1;j<=n;j++){
				if(cur.substr(i,b[j].size())==b[j]){
					string tmp;
					tmp=cur.substr(0,i)+a[j]+cur.substr(i+b[j].size());
					if(ma[tmp]){
						int res=ma[tmp]-1+mb[cur];
						return res;
					}
					if(mb[tmp]) continue;
					mb[tmp]=mb[cur]+1;
					qb.push(tmp);
				}
			}
		}
	}
	return 11;
}

int bfs(){
	qa.push(A);
	ma[A]=1;
	qb.push(B);
	mb[B]=1;
	if(A==B) return 0;
	while(qa.size()&&qb.size()){
		int t;
		if(qa.size()<=qb.size()){
			string cur=qa.front();
			qa.pop();
			t=extend(cur,0);
		}
		else{
			string cur=qb.front();
			qb.pop();
			t=extend(cur,1);
		}
		if(t<=10) return t;
	}
	return 11;
}


int main(void){
	
	cin >> A>> B;
	n=1;
	while(cin >> a[n] >> b[n]) n++;
	n--;
	int res=bfs();
	if(res>10) printf("NO ANSWER!");
	else printf("%d",res);
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/384482.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

X图形

1.题目 这道题是蓝桥云课上面的一道题目&#xff0c;它是2022年蓝桥杯省模拟题&#xff0c;题目难度为简单。 考察的知识点为递归。 题目链接&#xff1a;X图形 2.思路 如何理解题意&#xff1f; 蓝桥杯的题目和Leetcode题目最大的不同点在于&#xff0c;蓝桥杯的题目大部…

MogaNet实战:使用MogaNet实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 论文&#xff1a;https://arxiv.org/pdf/2211.03295.pdf 作者多阶博弈论交互这一全新视角探索了现代卷积神经网络的表示能力。这种交互反映了不同尺度上下文中变量间的相互作用效…

tcp 中使用的定时器

定时器的使用场景主要有两种。 &#xff08;1&#xff09;周期性任务 这是定时器最常用的一种场景&#xff0c;比如 tcp 中的 keepalive 定时器&#xff0c;起到 tcp 连接的两端保活的作用&#xff0c;周期性发送数据包&#xff0c;如果对端回复报文&#xff0c;说明对端还活着…

【后端高频面试题--设计模式下篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 后端高频面试题--设计模式下篇 后端高频面试题--设计模式上篇设计模式总览模板方法模式怎么理解模…

2024年腾讯云4核8G12M服务器性能测评,适合哪些使用场景?

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

【c++基础】同构数

说明 同构数是这样一种数&#xff1a;它出现在它的平方数的右端。例如&#xff1a;5的平方是25&#xff0c;5就是同构数&#xff0c;25的平方是625&#xff0c;25也是同构数。 再比如&#xff1a;100以内的同构数有1 5 6 25 76这5个整数。 请编程计算出1~N之间&#xff08;包…

算法村目录

大家好我是苏麟 , 这是算法村使用目录 . 算法通关村 从链表到动态规划的实战 目录 算法村开篇第一关 了解链表第二关 链表专题第三关 数组专题第四关 栈专题第五关 队列专题第六关 树专题第七关 二叉树遍历专题第八关 二叉树专题第九关 二分查找与二叉树专题第十关 快速排序与归…

传统推荐算法库使用--mahout初体验

文章目录 前言环境准备调用混合总结 前言 郑重声明&#xff1a;本博文做法仅限毕设糊弄老师使用&#xff0c;不建议生产环境使用&#xff01;&#xff01;&#xff01; 老项目缝缝补补又是三年&#xff0c;本来是打算直接重写写个社区然后给毕设使用的。但是怎么说呢&#xff…

事理与事件知识图谱

目录 前言1 事件定义与事理逻辑1.1 事件定义1.2 事理逻辑 2 事理知识图谱与传统知识图谱的区别和联系2.1 事理知识图谱与传统知识图谱的区别2.2 事理知识图谱与传统知识图谱的联系 3 事理知识图谱中的关系3.1 顺承关系3.2 因果关系3.3 条件关系3.4 并发关系3.5 上下位关系 4 事…

HP Pavilion Laptop 15-cs3xxx原装出厂Win10.20H1系统

惠普笔记本HP Pavilion - 15-cs3030tx原厂Windows10系统镜像下载 链接&#xff1a;https://pan.baidu.com/s/1LmdJoN7F3BGvt49ovq-eww?pwdzgmt 提取码&#xff1a;zgmt 适用型号&#xff1a; 15-cs3001tx&#xff0c;15-cs3030tx&#xff0c;15-cs3031tx&#xff0c;15-cs…

每日一练:LeeCode-654、最大二叉树【二叉树+DFS+分治】

本文是力扣LeeCode-654、最大二叉树【二叉树DFS分治】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其…

最全面的Docker安装部署,配置镜像加速

安装Docker 卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 配置Docker的yum仓库 首先…

Codeforces Round 924 (Div. 2)B. Equalize(思维+双指针)

文章目录 题面链接题意题解代码 题面 链接 B. Equalize 题意 给一个数组 a a a&#xff0c;然后让你给这个数组加上一个排列&#xff0c;求出现最多的次数 题解 赛时没过不应该。 最开始很容易想到要去重&#xff0c;因为重复的元素对于答案是没有贡献的。 去重后排序。&a…

HTTP 超文本传送协议

1 超文本传送协议 HTTP HTTP 是面向事务的 (transaction-oriented) 应用层协议。 使用 TCP 连接进行可靠的传送。 定义了浏览器与万维网服务器通信的格式和规则。 是万维网上能够可靠地交换文件&#xff08;包括文本、声音、图像等各种多媒体文件&#xff09;的重要基础。 H…

LLM大模型常见问题解答(2)

对大模型基本原理和架构的理解 大型语言模型如GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列是基于自注意力机制的深度学习模型&#xff0c;主要用于处理和生成人类语言。 基本原理 自然语言理解&#xff1a;模型通过对大量文本数据的预训练&#xff…

LLM之RAG实战(二十五)| 使用LlamaIndex和BM25重排序实践

本文&#xff0c;我们将研究高级RAG方法的中的重排序优化方法以及其与普通RAG相比的关键差异。 一、什么是RAG&#xff1f; 检索增强生成&#xff08;RAG&#xff09;是一种复杂的自然语言处理方法&#xff0c;它包括两个不同的步骤&#xff1a;信息检索和生成语言建模。这种方…

【开源】JAVA+Vue.js实现车险自助理赔系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车辆档案模块2.4 车辆理赔模块2.5 理赔照片模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 车辆表3.2.3 理赔表3.2.4 理赔照片表 四、系统展示五、核心代码5.1 查询车…

【PyQt】10 QLineEdit

文章目录 前言一、回显模式&#xff08;EchoMode&#xff09;1.1 四种回显模式1.2 代码展示运行结果 二、校验器2.1 代码2.2 运行结果 三、通过掩码限制输入3.1 代码3.2 运行结果 总结 前言 1、QLineEdit 可以输入单行文字 2、回显模式 3、校验器 4、掩码输入 一、回显模式&am…

图片懒加载:从低像素预览到高清加载

老生常谈的问题&#xff0c;图片太多太大的网站&#xff0c;往往由于图片加载过慢而导致页面白屏时间过长。本次年前最后一更&#xff0c;来讲一个加载方法来处理这种情况。 在使用 Next.js 时&#xff0c;发现其支持模糊图片占位符加载的方式&#xff0c;本文就手动实现一个 图…

最近vscode链接Autodl出现的问题

最近vscode链接Autodl出现的问题 一、问题的概述 在使用vscode连接autodl远程服务器的时候&#xff0c;在vscode的右下角出现了&#xff0c;以下的问题提示&#xff1a; 远程主机可能不符合glibc和libstdc VS Code服务器的先决条件 二、问题的原因 vscode版本过高的问题&…