当前位置: 首页 > news >正文

P1368 【模板】最小表示法(SAM 求最小循环移位)

【模板】最小表示法

题目描述

小敏和小燕是一对好朋友。

他们正在玩一种神奇的游戏,叫 Minecraft。

他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的,而且由于机器的要求,他们只能做到把这个工艺品最左边的方块放到最右边。

他们想,在仅这一个操作下,最漂亮的工艺品能多漂亮。

两个工艺品美观的比较方法是,从头开始比较,如果第 iii 个位置上方块不一样那么谁的瑕疵度小,那么谁就更漂亮,如果一样那么继续比较第 i+1i+1i+1 个方块。如果全都一样,那么这两个工艺品就一样漂亮。

输入格式

第一行一个整数 nnn,代表方块的数目。

第二行 nnn 个整数,每个整数按从左到右的顺序输出方块瑕疵度的值。

输出格式

一行 nnn 个整数,代表最美观工艺品从左到右瑕疵度的值。

样例 #1

样例输入 #1

10
10 9 8 7 6 5 4 3 2 1

样例输出 #1

1 10 9 8 7 6 5 4 3 2

提示

  • 对于 20%20\%20% 的数据,n≤1000n\le 1000n1000
  • 对于 40%40\%40% 的数据,n≤104n\le 10^4n104
  • 对于 100%100\%100% 的数据,n≤3×105n\le 3\times 10^5n3×105

题意:

虽然题目给定的是个数组,但我们可以把问题抽象成:给定一个长度为 n 的字符串 s,找出字典序最小的循环移位(长度也为 n)。以下的分析我们均用 “串” 来代替数组。

思路:

SAM 高度压缩了原串各种长度的所有子串。我们发现:字符串 s + s 包含 s 的所有循环移位作为子串。所以如果要找字典序的最小循环移位,不妨将原串复制一份,形成一个长度为 2n 的串,选择所有长度为 n 的子串集合中字典序最小的那个

我们对长度为 2n 的新串构建后缀自动机,从DAG的根节点开始,每次贪心的走字典序最小的节点,走 n 步,边走边输出即可。

时间复杂度:O(n)O(n)O(n)

代码:

#include<bits/stdc++.h>using namespace std;const int N = 6e5 + 10, M = N << 1;
int n, a[N], len[M], fa[M], np = 1, tot = 1;
map<int, int> ch[M];
vector<int> g[M];void extend(int c)
{int p = np; np = ++tot;len[np] = len[p] + 1;while (p && !ch[p][c]) {ch[p][c] = np;p = fa[p];}if (!p) {fa[np] = 1;}else {int q = ch[p][c];if (len[q] == len[p] + 1) {fa[np] = q;}else {int nq = ++tot;len[nq] = len[p] + 1;fa[nq] = fa[q], fa[q] = fa[np] = nq;while (p && ch[p][c] == q) {ch[p][c] = nq;p = fa[p];}ch[nq] = ch[q];}}
}signed main()
{scanf("%d", &n);for (int i = 0; i < n; ++i) {scanf("%d", &a[i]);a[i + n] = a[i];}n <<= 1;for (int i = 0; i < n; ++i) {extend(a[i]);}int p = 1;for (int i = 0; i < n / 2; ++i) {auto pp = ch[p].begin();	//由于map自动按第一关键字排序,因此每次贪心地选择首元素走就行int ele = (*pp).first;int nd = (*pp).second;printf("%d ", ele);p = nd;}puts("");return 0;
}

相关文章:

P1368 【模板】最小表示法(SAM 求最小循环移位)

【模板】最小表示法 题目描述 小敏和小燕是一对好朋友。 他们正在玩一种神奇的游戏&#xff0c;叫 Minecraft。 他们现在要做一个由方块构成的长条工艺品。但是方块现在是乱的&#xff0c;而且由于机器的要求&#xff0c;他们只能做到把这个工艺品最左边的方块放到最右边。…...

投票感知器参数学习算法

投票感知器参数学习算法 以下为投票感知器参数学习算法的伪代码&#xff1a; 输入&#xff1a;训练集 (x1,y1),(x2,y2),...,(xn,yn)(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)(x1​,y1​),(x2​,y2​),...,(xn​,yn​)&#xff0c;学习率 η\etaη&#xff0c;最大迭代次数 TTT…...

Hyper-v下安装CentOS-Stream-9

1、我不想要动态扩展的硬盘&#xff0c;固定大小硬盘性能更高&#xff0c;所以这里我先创建一个固定硬盘&#xff08;如果你想用动态扩展的硬盘&#xff0c;那么可以省略前面几步&#xff0c;直接从第7步开始&#xff0c;并在第12步选择创建可动态扩展的虚拟硬盘&#xff09;&a…...

数据结构之顺序表,实现顺序表的增删改查

目录 一、顺序表的概念 二、顺序表的分类 1.静态顺序表 2.动态顺序表 3.顺序表的增删改查 总结 一、顺序表的概念 顺序表是一段物理地址连续的村塾单元依次存储数据元素的线性结构&#xff0c;一般情况下使用数组存储&#xff0c;在数组上完成数据的增删改查。 二、顺…...

HTB-Jeeves

HTB-Jeeves信息收集80端口50000端口![在这里插入图片描述](https://img-blog.csdnimg.cn/5824bf345bc040ee9e449bebeade9495.png)开机kohsuke -> Administrator信息收集 80端口 ask jeeves是一款以回答用户问题提问的自然语言引擎&#xff0c;面对问题首先查看数据库里是否…...

大力出奇迹——GPT系列论文学习(GPT,GPT2,GPT3,InstructGPT)

目录说在前面1.GPT1.1 引言1.2 训练范式1.2.1 无监督预训练1.2.2 有监督微调1.3 实验2. GPT22.1 引言2.2 模型结构2.3 训练范式2.4 实验3.GPT33.1引言3.2 模型结构3.3 训练范式3.4 实验3.4.1数据集3.5 局限性4. InstructGPT4.1 引言4.2 方法4.2.1 数据收集4.2.2 各部分模型4.3 …...

Linux ubuntu更新meson版本

问题描述 在对项目源码用meson进行编译时&#xff0c;可能出现以下错误 meson.build:1:0: ERROR: Meson version is 0.45.1 but project requires > 0.58.0. 或者 meson_options.txt:1:0: ERROR: Unknown type feature. 等等&#xff0c;原因是meson版本跟设置的不适配。 …...

匹配yyyy-MM-dd日期格式的正则表达式

^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$ 解释&#xff1a; ^&#xff1a;匹配行的开头 \d{4}&#xff1a;匹配四个数字&#xff0c;表示年份 -&#xff1a;匹配一个横杠 (0[1-9]|1[0-2])&#xff1a;匹配01到12的月份&#xff0c;0开头的要匹配两位数字&#xff0c;1开…...

【失业预告】生成式人工智能 (GAI)AIGC

文章目录AIGCGAIAGI应用1. 计算机领域2. 金融领域3. 电商领域4. C端娱乐5. 游戏领域6. 教育领域7. 工业领域8. 医疗领域9. 法律领域10. 农业/食品领域11. 艺术/设计领域来源AIGC AIGC&#xff0c;全称为Artificial Intelligence Generated Content&#xff0c;是一种新型的人工…...

TensorFlow 2.0 的新增功能:第一、二部分

原文&#xff1a;What’s New in TensorFlow 2.0 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如何实现目…...

Spring Boot配置文件详解

前言 Spring Boot 官方提供了两种常用的配置文件格式&#xff0c;分别是properties、YML格式。相比于properties来说&#xff0c;YML更加年轻&#xff0c;层级也是更加分明。 1. properties格式简介 常见的一种配置文件格式&#xff0c;Spring中也是用这种格式&#xff0c;语…...

实习面试题整理1

1、进行一下自我介绍 2、介绍一下你简历里的两个项目 3、说说vue的生命周期&#xff08;具体作用&#xff09; 4、说说你对vue单页面和多页面应用的理解 5、说说vue里自带的数组方法&#xff08;七种&#xff0c;往响应式数据上靠&#xff09; 6、说说vue双向数据绑定&…...

最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…...

OpenCV——常用函数

cv::circle(overlay, pt, 2, cv::Scalar(0,green,red),-1); 使用OpenCV库中的circle()函数在图像上绘制圆形的代码。 具体来说&#xff0c;它的参数如下&#xff1a; - overlay&#xff1a;图像&#xff0c;在该图像上绘制圆形&#xff1b; - pt&#xff1a;圆心位置的cv:…...

超详细从入门到精通,pytest自动化测试框架实战-fixture多样玩法(九)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 在编写测试用例&…...

OJ练习第70题——困于环中的机器人

困于环中的机器人 力扣链接&#xff1a;1041. 困于环中的机器人 题目描述 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是y轴的正方向。 南方向 是y轴的负方向。 东方向 是x轴的正方向。 西方向 是x轴的负方向。 机器人可以接受…...

运行时内存数据区之虚拟机栈——局部变量表

这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样&#xff0c;Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;也是线程私有的&#xff0c;它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型&#xf…...

Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

场景 1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解&#xff0c; 然后综合各个小问题&#xff0c;得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次…...

2个 windows 下的网络测试工具

环境windows 10 64bittcpingtcproute简介TCPing 和 TCProute 都是 windows 下的用于测试 TCP 连接的工具&#xff0c;它们可以帮助用户确定网络连接的可用性和响应时间。TCPing下载地址&#xff1a; https://elifulkerson.com/projects/tcping.phpTCPing 通过向目标主机发送 TC…...

HDU - 4734 -- F(x)

题目如下&#xff1a; For a decimal number x with n digits (AnAn−1An−2...A2A1)(A_nA_{n-1}A_{n-2} ... A_2A_1)(An​An−1​An−2​...A2​A1​), we define its weight as F(x)An∗2n−1An−1∗2n−2...A2∗2A1∗1.F(x) A_n * 2^{n-1} A_{n-1} * 2^{n-2} ... A_2 *…...

CentOS 7.9上5分钟搞定openGauss极简版安装(附防火墙和权限避坑指南)

CentOS 7.9极速部署openGauss&#xff1a;5分钟实战与深度避坑手册 在数据库技术快速迭代的今天&#xff0c;openGauss作为企业级开源数据库的佼佼者&#xff0c;正受到越来越多开发者和运维团队的青睐。本文将带你在CentOS 7.9系统上&#xff0c;用最短时间完成openGauss极简版…...

从样本到序列:枸杞DNA条形码鉴定的关键步骤与陷阱规避

一、引言&#xff1a;为何需要PCR鉴定枸杞&#xff1f;枸杞&#xff08;Lyciumspp.&#xff09;作为药食同源的重要资源&#xff0c;市场长期存在以土库曼枸杞、白刺等近缘种或伪品冒充高价值宁夏枸杞&#xff08;L. barbarum&#xff09;的现象。传统鉴别依赖果实形态和显微特…...

SystemC随机验证环境构建:从约束生成到覆盖率驱动的自动化测试

1. 项目概述&#xff1a;从确定性仿真到随机验证的跨越在芯片设计和验证领域&#xff0c;SystemC 早已不是陌生的名字。它作为 C 的类库扩展&#xff0c;为系统级建模和硬件/软件协同验证提供了强大的框架。然而&#xff0c;很多刚接触 SystemC 验证的朋友&#xff0c;往往止步…...

【VASP实战】Ubuntu 22.04 LTS 部署 vasp.6.x 指南:从Intel oneAPI编译到GPU加速测试

1. VASP 6.x与Ubuntu 22.04 LTS环境概述 VASP&#xff08;Vienna Ab initio Simulation Package&#xff09;是材料科学领域广泛使用的第一性原理计算软件&#xff0c;能够模拟原子尺度的电子结构、分子动力学等过程。最新版VASP 6.x在并行计算效率和GPU加速支持上有显著提升&a…...

Linux CoreDump实战指南:从原理到容器化环境配置与自动化分析

1. 项目概述&#xff1a;为什么我们需要一份CoreDump实战指南&#xff1f;在服务器运维和后台开发领域&#xff0c;最让人头疼的瞬间之一&#xff0c;莫过于半夜被电话叫醒&#xff0c;被告知线上服务“挂了”。登录服务器一看&#xff0c;进程消失得无影无踪&#xff0c;只留下…...

【GitHub热门工具】TikTokDownloader深度体验:从零到一的抖音/TikTok视频下载实战

1. 为什么我们需要TikTokDownloader&#xff1f; 最近在社交媒体上看到一个超有趣的视频&#xff0c;想保存下来反复观看或者分享给朋友&#xff0c;却发现平台没有提供下载按钮&#xff1f;这种场景相信很多人都遇到过。TikTokDownloader就是为了解决这个痛点而生的开源工具&a…...

为什么很多企业,最后真正被拖垮的,其实是“系统维护成本”?——真正昂贵的,从来不是“开发系统”,而是“长期维护复杂系统”

很多企业第一次做商城系统时&#xff0c;通常都会特别关注&#xff1a; 开发成本高不高上线速度快不快功能够不够多页面交付快不快 因为在业务初期。 大家最关注的&#xff1a; 通常都是&#xff1a; 先把系统上线 所以很多企业最开始都会认为&#xff1a; “开发成本” …...

go 链表 (标准库实现)

Go 链表简介Go 标准库里没有单链表&#xff0c;只在 container/list 包里提供了双向循环链表。两个核心类型list.List &#xff1a;链表本身&#xff0c;包含哨兵节点和长度 list.Element &#xff1a;链表节点&#xff0c;存数据 前后指针 type Element struct {Value interf…...

生物信息学流水线效率翻倍:在Linux集群上为fastp v0.23.4配置多线程与批量处理脚本

生物信息学流水线效率翻倍&#xff1a;在Linux集群上为fastp v0.23.4配置多线程与批量处理脚本 当实验室的测序仪每天吐出TB级的FASTQ文件时&#xff0c;生物信息工程师的终端里往往挤满了等待处理的nohup进程。我们曾用三台服务器连续运行72小时才完成某批800个样本的质控——…...

终极Gmail桌面体验:告别浏览器标签混乱,拥抱高效邮件管理

终极Gmail桌面体验&#xff1a;告别浏览器标签混乱&#xff0c;拥抱高效邮件管理 【免费下载链接】gmail-desktop :postbox: Gmail desktop app for macOS, Windows & Linux (formerly Gmail Desktop) 项目地址: https://gitcode.com/gh_mirrors/gm/gmail-desktop 厌…...