洛谷 P4683 [IOI2008] Type Printer

news2024/11/18 1:41:27

原题点这里

题目来源于:洛谷

题目本质:深搜,字典树Trie

当时想法:当时看了题目标签,就有思路了(见代码注释),但一直RE+WA最后只剩下RE。

正确思路:

我们使用字典树来完成。

首先,有一个点大大的降低了题目难度,就是打印结束时,允许有部分字母留在打印机内

众所周知,字典树很好地利用了字符串的公共前缀,这也就是上一行出现的原因。

如果我们想要操作数尽可能少,那我们的删除数的操作就要尽可能的少。

插入函数:

void insert(string s) {	//用我好同桌的筷子
	int p = 0;
	for (int i = 0; s[i]; i++) {
		int x = s[i] - 'a';
		if (!tree[p][x])
			tree[p][x] = ++ind; // 建点
		le[tree[p][x]] = x + 'a'; // 记录
		p = tree[p][x];
	}
	en[p] = 1; //标记结尾
}

标记最长:

void mark(string s) {
	int p = 0;
	for (int i = 0; s[i]; i++) {
		int x = s[i] - 'a';
		k[tree[p][x]] = 1;
		p = tree[p][x];
	}
}

dfs:

void dfs(int x) {
	if (en[x] == 1 && x != 0) {
		ans++;
		output += "P";
	}

	if (ans == n) {
		cout << output.size() << endl;
		for (int i = 0; output[i]; i++)
			cout << output[i] << endl;
		return;
	}

	int reg;
	for (int i = 0; i < 26; i++) {
		reg = tree[x][i];
		if (k[reg] == 0 && reg != 0) {
			output += le[reg];
			dfs(reg);
			output += "-";
		}
	}

	for (int i = 0; i < 26; i++) {
		reg = tree[x][i];
		if (k[reg] && reg) {
			output += le[reg];
			dfs(reg);
			output += "-";
		}
	}
}

主函数:

int main() {
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		string s;
		cin >> s;
		shu(s);
		if (s.size() > p.size()){	//一样要判断字符串长度
			p = s;
		}
	}
	mark(p);
	dfs(0);	//	将输出掺杂到dfs里
	return 0;
}

我写的纯RE代码(思路可供参考)(洛谷高达64大分):

//第二版不负众望又RE+WA了
//最后一次!
//What can I say!
//依旧感觉会崩掉
//纯RE没有WA了,CAO!
//前两版就不发了,大错特错!
#include<bits/stdc++.h>
using namespace std;
const int N = 25005;
const int M = 30;
int n, cur = 0, step = 1;
int tr[N][M];
char d[N];
bool mo[N], fla[N];
bool flag = false;
string q, p;
void shu(string s) {
	int fu = 0;
	int len = s.size();
	for (int i = 0; i < len; ++i) {
		int t = s[i] - 'a';
		if (tr[fu][t] == 0){
			tr[fu][t] = ++cur;
		}
		d[tr[fu][t]] = char(t + 'a');
		fu = tr[fu][t];
	}
	mo[fu] = true;
}
void mark(string s) {
	int fu = 0;
	int len=s.size();
	for (int i = 0; i < len; ++i) {
		int t = s[i] - 'a';
		fla[tr[fu][t]] = true;
		fu = tr[fu][t];
	}
}
void dfs(int mao) {
	if (mo[mao]) {
		++step;
		q = q + 'P';
	}
	if (step > n) {
		cout << q.size() << endl;
		int len=q.size();
		for (int i = 0; i < len; ++i){
			cout << q[i] << endl;
		}
		exit(0);	//直接退出
	}
	int x;
	int tmp = -1;	//使用tmp做临时标记
	for (int i = 0; i < 26; ++i) {
		x = tr[mao][i];
		if (fla[x]){
			tmp=x;
		}
		if (x != 0 && !fla[x]) {
			q = q + d[x];
			dfs(x);
		}
	}
	if (tmp != -1) {
		q = q + d[tmp];
		dfs(tmp);
	}
	if (tmp == -1 && fla[mao]){
		flag=true;
	}
	if (!flag){
		q = q + '-';
	}
}
int main() {
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		string s;
		cin >> s;
		shu(s);
		if (s.size() > p.size()){	//一样要判断字符串长度
			p = s;
		}
	}
	mark(p);
	dfs(0);	//	将输出掺杂到dfs里
	return 0;
}

正解参考于:P4683 详解 - 洛谷专栏 (luogu.com.cn)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】任务四:使用贝叶斯算法识别葡萄酒类别和使用三种不同的决策树方法(ID3,C4.5,CART)对鸢尾花数据进行分类

目录 1.基础知识 1.1 高斯贝叶斯&#xff08;Gaussian Naive Bayes&#xff09; 1.2 决策树&#xff08;Decision Tree&#xff09; 1.3 模型评价&#xff08;Model Evaluation&#xff09; 1.3.1 评价维度&#xff1a; 1.3.2 评价方法&#xff1a; 2.使用贝叶斯算法识别…

android 删除系统原有的debug.keystore,系统运行的时候,重新生成新的debug.keystore,来完成App的运行。

1、先上一个图&#xff1a;这个是keystore无效的原因 之前在安装这个旧版本android studio的时候呢&#xff0c;安装过一版最新的android studio&#xff0c;然后通过模拟器跑过测试的demo。 2、运行旧的项目到模拟器的时候&#xff0c;就报错了&#xff1a; Execution failed…

proteus+51单片机+AD/DA学习5

目录 1.DA转换原理 1.1基本概念 1.1.1DA的简介 1.1.2DA0832芯片 1.1.3PCF8591芯片 1.2代码 1.2.1DAC8053的代码 1.2.2PCF8951的代码 1.3仿真 1.3.1DAC0832的仿真 1.3.2PFC8951的仿真 2.AD转换原理 2.1AD的基本概念 2.1.1AD的简介 2.1.2ADC0809的介绍 2.1.3XPT2…

双指针算法专题(1)

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; 优选算法专题 目录 双指针算法的介绍 283. 移动零 1089. 复写零 202. 快乐数 11.盛最多水的容器 双指针算法的介绍 在正式做题之前&a…

C++ 获取文件夹下的全部文件及指定文件(代码)

文章目录 1.&#xff08;C17&#xff09;获得指定目录下的所有文件&#xff08;不搜索子文件夹&#xff09;2.&#xff08;C11&#xff09;获得指定目录下的所有文件&#xff08;不搜索子文件夹&#xff09;3.&#xff08;C11&#xff09;获取目录下指定格式的所有文件&#xf…

工厂安灯系统在优化生产流程上的优势

工厂安灯系统通过可视化的方式&#xff0c;帮助工厂管理者和操作工人及时了解生产状态&#xff0c;快速响应问题&#xff0c;从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备&#xff0c;工人…

OpenGL(四) 纹理贴图

几何模型&材质&纹理 渲染一个物体需要&#xff1a; 几何模型&#xff1a;决定了物体的形状材质&#xff1a;绝对了当灯光照到上面时的作用效果纹理&#xff1a;决定了物体的外观 纹理对象 纹理有2D的&#xff0c;有3D的。2D图像就是一张图片&#xff0c;3D图像是在…

记得忘记密码情况下如何退出苹果Apple ID

在日常使用苹果手机时&#xff0c;我们可能会遇到需要退出Apple ID的情况&#xff0c;比如更换手机、不再使用某些服务或出于安全考虑等。下面&#xff0c;我们就来详细介绍一下苹果手机如何退出Apple ID。 情况一&#xff1a;记得Apple ID密码 若是记得Apple ID密码&#xff…

3. 轴指令(omron 机器自动化控制器)——>MC_HomeWithParameterMC_Move

机器自动化控制器——第三章 轴指令 3 MC_HomeWithParameter变量▶输入变量▶输出变量 功能说明▶原点复位动作与原点复位参数的关系▶重启运动指令▶多重启动运动指令▶错误代码 MC_Move变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶重启运动指令▶多重启动运…

pytorch入门(1)——pytorch加载数据初认识

环境配置及其安装&#xff1a; 2023最新pytorch安装&#xff08;超详细版&#xff09;-CSDN博客 pytorch加载数据初认识 Dataset&#xff1a;创建可被Pytorch使用的数据集 提供一种方式获取数据及其label Dataloader&#xff1a;向模型传递数据 为网络提供不同的数据形式 …

算法_队列+宽度优先搜索---持续更新

文章目录 前言N叉树的层序遍历题目要求题目解析代码如下 二叉树最大宽度题目要求题目解析代码如下 在每个树中找最大值题目要求题目解析代码如下 二叉树的锯齿形层序遍历题目要求题目解析代码如下 前言 本文将会向你介绍有关队列宽度优先搜索的题目&#xff1a;N叉树的层序遍历…

【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))

【每日一题】LeetCode 2398.预算内的最多机器人数目&#xff08;滑动窗口、数组、二分查找、前缀和、堆&#xff08;优先队列&#xff09;&#xff09; 题目描述 给定两个整数数组 chargeTimes 和 runningCosts&#xff0c;分别代表 n 个机器人的充电时间和运行成本。再给定一…

喂料机和失重秤的区别?

喂料机和失重秤的区别&#xff1f;在硬件结构上的具体差异&#xff1a; 1. 喂料机的硬件结构 喂料机的结构比较简单&#xff0c;主要功能是传送物料&#xff0c;不涉及精确的称重系统。其硬件结构通常包括以下部分&#xff1a; 料斗&#xff1a;用于存储物料&#xff0c;物料…

cesium.js 入门到精通(7)

我们说一下相机的概念&#xff1a; 生活中的相机是一个用来拍照的设备&#xff0c;而这里的相机应该理解成一个人机交互的媒介。地图的缩放、平移、旋转&#xff0c;以及相关的鼠标操作都是由相机作为媒介来实现的。相机的位置和姿态参数决定了我们能看到的地图的样子。 可以…

centos7.9安装clamav教程

本章教程主要记录在centos7.9安装clamav过程。 ClamAV(Clam AntiVirus)是一个开源的防病毒软件工具,主要用于检测和消除恶意软件。它最初由 Tomasz Kojm 于 2001 年开发,并由 Cisco Systems 维护和支持。ClamAV 广泛应用于邮件网关、文件服务器和其他需要防病毒保护的环境中…

Linux软件包循环依赖解决 彻底删除i386架构 更新软件源

0.问题 之前为了wine和intel核显驱动加了32位的库&#xff0c;现在每次apt upgrade更新都被循环依赖弄得不堪其扰&#xff0c;apt --fix-broken install解决缺失都循环报错&#xff0c;寸步难行&#xff0c;忍无可忍、 而且一看全是i386的依赖&#xff0c;这32位我不用也罢&…

apache文件共享和访问控制

实现apache文件共享 文件共享路径 <Directory "/var/www/html"> #默认发布路径&#xff0c;功能限制 Options Indexes FollowSymLinks #indexes支持文件共享功能 AllowOverride None Require all granted </Directory> 进入到该路径下 cd…

【Java Bean Validation API】Spring3 集成 Bean 参数校验框架

Spring3 集成 Bean 参数校验框架 Java Bean Validation API 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 检验框架依赖&#xff08;也可能不需要&#xff0c;在前面 spring 的启动依赖里就有&#xff09;&#xff1a; <!-- 自定义验证注解 -->…

【原创】java+springboot+mysql高校社团网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

spring内置的

程序里注入了spring内置的线程池&#xff0c;但没有看到线程池相关参数配置&#xff08;corePoolSize maxPoolSize 队列大小&#xff09;&#xff0c;网上查说默认是1个线程&#xff0c;结果和生产实际看到的不一致。 从生产可以看到有8个线程在跑&#xff0c;task-1 task-8&am…