如何用 Lyndon 薄纱 SA

推销 Lyndon 理论学习笔记(没写完)

P5108 仰望半月的夜空

给一个字符串 \(s\),对 \(i\in[1,|s|]\) 问长度为 \(i\) 的最小子串的第一次出现。

先给复杂度:问最后一次出现可以 \(O(|s|)\),问第一次出现可以结合哈希二分做到 \(O(|s|\log|s|)\)

字典序问题,可以在 Lyndon 分解上考虑,设分解得到 \(s=w_1+\dots+w_k\)

考虑长度为 \(i\) 的最小子串在哪里起头。首先根据 Lyndon 串的定义,在某个 \(w_p\) 中间起头肯定不优,

而且分解出的 Lyndon 串字典序是单调不增的,所以应该在尽量靠后的 \(w_p\) 起头,

所以可以得出结论:应该在 \(|w_p+w_{p+1}+\dots+w_k|\ge i\) 的最后一个 \(w_p\) 处起头,

但这个子串不一定只在这里出现,考虑它还在哪里出现过。

因为分解出的 Lyndon 串字典序是单调不增的,所以这个子串只在 \(w_p\) 及其前的若干个 Lyndon 串中出现。

二分这个子串最早在哪里出现即可。

#include <cstdio>
#include <cstring>
char _[300050];
int n, o, S, l[300050], a[300050];
unsigned long long p[300050], h[300050];
int Q(int l, int r) { return h[r] - h[l - 1] * p[r - l + 1]; }
int main()
{scanf("%d%d", &S, &n);if (S == 26){scanf("%s", _ + 1);for (int i = 1; i <= n; ++i)a[i] = _[i];}else{for (int i = 1; i <= n; ++i)scanf("%d", a + i);}for (int i = p[0] = 1; i <= n; ++i)p[i] = p[i - 1] * 10000019, h[i] = h[i - 1] * 10000019 + a[i];int i = 1, j, k;while (i <= n){j = i + 1, k = i;while (j <= n){if (a[j] == a[k])++j, ++k;else if (a[j] > a[k])++j, k = i;elsebreak;}while (i <= k)l[++o] = i, i += j - k;}for (int i = 1, j = o; i <= n; ++i){if (n - l[j] + 1 < i)--j;int L = 1, R = j;while (L <= R){int M = L + R >> 1;if (Q(l[M], l[M] + i - 1) == Q(l[j], l[j] + i - 1))R = M - 1;elseL = M + 1;}printf("%d ", l[L]);}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低功耗蓝牙芯片CH57x,CH58x,CH59x回读codeflash及dataflash数据

一、读取Codeflash数据 芯片内部程序是有加密的,不支持外部工具直接读取,因此只能通过内部接口读取, 而ISP烧录器工具在烧录时,默认会擦除8k的数据,因此只能读到8k以后的codeflash部分: 方式:烧录一份不超过8k的程序,烧录器烧录时不能勾选清空codeflash,保留8k以后的原…

如何选择适合建筑行业的文档管理软件?

智能建筑(Smart Building)的设计和实施离不开严谨的文档管理。无论是智能化设备安装的工程图纸,还是系统集成的技术方案,任何细微的版本错误都可能导致后期问题。这时候,文档比较工具的应用尤为关键,能够显著提升项目质量与落地速度。 场景分析:智能建筑的系统集成挑战 …

学前端 4 个月想进中厂,该怎么做?

大厂和中厂前端的区别更多的是在技术学习的深度和推动项目的能力;而中厂和小厂前端的区别在于技术学习的广度和解决问题的能力,换言之,在能干活的基础上,干活要快,遇到问题能够自己解决。大家好,我是程序员鱼皮。收到一位编程导航鱼友的提问,想要自学前端 4 个月进入中厂…

Linux-Prometheus

Prometheus监控架构 prometheus通过各种exporter监控客户端. 常用exporternode_exporter获取主机的系统监控项. 其他项目通过各种exporter(docker运行)实现.这个部分主要讲解的是prometheus服务端的配置(连接客户端)prometheus.yml主配置文件. 静态配置 :static_configs 书写…

为什么不应将游戏逻辑写在FixedUpdate中

1)为什么不应将游戏逻辑写在FixedUpdate中2)关于il2cpp.so裁剪的问题3)3DMax怎么统计Unity的顶点数量4)Unity拉起SDK后,导致场景贴图丢失这是第417篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。…

Linux其他

1. 2.Gitlab应用架构 3.运维发展史 4.云原生时代: 以Devops、SRE框架为指导,Docker/K8S/微服务为基础,用分布式方式加上 Python和 Go语言,构建一套云技术产品体系,以及进行高级管理工具的二次开发,实现属于公司自己 的自动化运维体系以及云技术体系的自动化产品。使用的自…

可视化工具在UI/UX设计中的应用与管理策略

一、设计行业的项目管理挑战 设计项目通常具有较强的创意性、变化性和协作性。与其他行业的项目管理不同,设计行业的项目管理面临一些独特的挑战: 1.1 多轮设计迭代和客户反馈 设计项目通常不是一次性完成的,而是通过多个设计迭代不断完善。每个设计阶段结束后,团队通常需要…

《安富莱嵌入式周报》第348期:开源低功耗测试仪,开源创意万用表,续航100-300小时,开源PCB电机,自制shell和网络协议栈,开源水培自动化系统

周报汇总地址:http://www.armbbs.cn/forum.php?mod=forumdisplay&fid=12&filter=typeid&typeid=104 视频版: https://www.bilibili.com/video/BV1Tzr9Y3EQ7/目录: 1、开源低功耗测试仪 2、开源创意万用表,续航100-300小时 3、低级编程和优化实现 4、资讯 (1…

16C++循环结构-(do-while循环)1——教学

1、do-while 语句; 2、各数位之和; 3、纯小数变整数; 4、数学计算一、do-while 语句 问题:每次测试后狐狸老师总会把成绩输入计算机,进行处理分析。但输入时有时会出错,如当满分为100分时,输入小于0或大于100的数,表示输入有误。试编一程序,输入某一位同学成绩时,自动检查…

南京芯麒电子-基于6U VPX的TMS320C6678+XCVU9P的高性能处理平台

概述 该平台是由16nm工艺的的XCUV9P FPGA和TI公司高性能数字信号处理器TMS320C6678构建的一款标准6U VPX高性能数据处理平台,VPX P1上定义4个x4 GTY,P2上1路PCIe x16接口、P3~P6上引出了大量GTY/GTH以及RS422/GPIO信号。板卡提供2个FMC+接口、可搭配我司各类FMC子卡使用,实现…

XTR105 XTR105UA/2K5规格书具有传感器激励和线性化的 4mA 至 20mA 电流变送器芯片

XTR105 是一款带有两个精准电流源的单片 4mA 至20mA、2 线制电流发送器。该器件在一个单集成电路上提供针对铂 RTD 温度传感器和桥、仪表放大器以及电流输出电路的完整电流激励。多用途线性化电流提供一个对 RTD 的第二阶修正,通常可以实现一个 40:1 的线性改进。仪器放大器增…

[rustGUI][iced]基于rust的GUI库iced(0.13)的部件学习(03):图像的导入、显示、调整(暨image部件的使用介绍)

前言 本文是关于iced库的部件介绍,iced库是基于rust的GUI库,作者自述是受Elm启发。 iced目前的版本是0.13.1,相较于此前的0.12版本,有较大改动。 本合集是基于新版本的关于分部件(widget)的使用介绍,包括源代码介绍、实例使用等。 环境配置 系统:window10 平台:visual…