【学习笔记】lyndon分解

news2025/1/26 14:11:26

摘抄自quack的ppt。

这部分和 s a sa sa的关联比较大,可以加深对 s a sa sa的理解。

Part 1

如果字符串 s s s的字典序在 s s s以及 s s s的所有后缀中是最小的,则称 s s s是一个 lyndon \text{lyndon} lyndon串。

lyndon \text{lyndon} lyndon分解,指的是把一个字符串分成若干段,每一段都是一个 lyndon \text{lyndon} lyndon串,问最少的分割段数。

方法一:用后缀数组 s a [ 1 ] sa[1] sa[1]就是 lyndon \text{lyndon} lyndon分解的最后那一段, lyndon \text{lyndon} lyndon分解倒数第二段就是把 s a [ 1 ] sa[1] sa[1]那一段排除之后排的最靠前的 s a sa sa,以此类推。

s a sa sa可以用来 lyndon \text{lyndon} lyndon分解依赖于以下结论:

定义数组 a [ i ] a[i] a[i]为最小的 j j j,使得 j > i j>i j>i S [ j : ∣ S ∣ − 1 ] < S [ i : ∣ S ∣ − 1 ] S[j:|S|-1]<S[i:|S|-1] S[j:S1]<S[i:S1],如果不存在这样的 j j j,可以认为 a i = ∣ S ∣ a_i=|S| ai=S

那么, S S S lyndon \text{lyndon} lyndon分解的第一项为 S [ 0 : a [ 0 ] − 1 ] S[0:a[0]-1] S[0:a[0]1],且后面 m − 1 m-1 m1项就是 S [ a [ 0 ] : ∣ S ∣ − 1 ] S[a[0]:|S|-1] S[a[0]:S1] lyndon \text{lyndon} lyndon分解。

证明:显然此时不能划分到 a [ 0 ] a[0] a[0]之后,否则可以根据原串后缀的信息道出矛盾。因此只需论证划分到 a [ 0 ] a[0] a[0]合法即可。注意到此时 S [ a [ 0 ] ] ≤ S [ 0 ] S[a[0]]\le S[0] S[a[0]]S[0],因此对于任意 j ∈ [ 1 , a [ 0 ] − 1 ] j\in [1,a[0]-1] j[1,a[0]1],一定满足 S [ 0 : a [ 0 ] − j − 1 ] ≠ S [ j : a [ 0 ] − 1 ] S[0:a[0]-j-1]\ne S[j:a[0]-1] S[0:a[0]j1]=S[j:a[0]1],又因为 s a [ 0 ] < s a [ j ] sa[0]<sa[j] sa[0]<sa[j],因此 S [ 0 : a [ 0 ] − 1 ] S[0:a[0]-1] S[0:a[0]1]一定是它的所有后缀当中最小的。

基本性质:

1.1 1.1 1.1 若字符串 u , v u,v u,v lyndon \text{lyndon} lyndon串且 u < v u<v u<v,则 u v uv uv lyndon \text{lyndon} lyndon串。

1.2 1.2 1.2 若字符串 s s s lyndon \text{lyndon} lyndon串, s ′ a s'a sa s s s的前缀,那么 s ′ b ( b > a ) s'b(b>a) sb(b>a) lyndon \text{lyndon} lyndon串。(注意 s ′ a s'a sa不一定是 lyndon \text{lyndon} lyndon串)

方法二:duval 算法

每次维护一个前缀的 lyndon \text{lyndon} lyndon分解。这个前缀 S [ 1 : k − 1 ] S[1:k-1] S[1:k1]可以被分解成 s 1 , . . . , s g s_1,...,s_g s1,...,sg这些 lyndon \text{lyndon} lyndon串和 S [ i : k − 1 ] S[i:k-1] S[i:k1]这个近似 lyndon \text{lyndon} lyndon串(形如 w k w ′ w^kw' wkw w w w是一个 lyndon \text{lyndon} lyndon串, w ′ w' w w w w的前缀)。

具体的,三个变量 i , j , k i,j,k i,j,k维持一个循环不变式:

  • S [ 0 : i − 1 ] = s 1 s 2 . . . s g S[0:i-1]=s_1s_2...s_g S[0:i1]=s1s2...sg 是已经固定下来的分解,满足 s l s_l sl lyndon \text{lyndon} lyndon串,且 s l ≥ s l + 1 s_l\ge s_{l+1} slsl+1(否则可以合并)。
  • S [ i : k − 1 ] = t 1 t 2 . . . t h v S[i:k-1]=t_1t_2...t_hv S[i:k1]=t1t2...thv是没有固定的分解,满足 t 1 t_1 t1 lyndon \text{lyndon} lyndon串, t 1 = t 2 = . . . = t h t_1=t_2=...=t_h t1=t2=...=th v v v t h t_h th的(可为空的)真前缀,令 j = k − ∣ t 1 ∣ j=k-|t_1| j=kt1

在这里插入图片描述

复杂度为 O ( n ) O(n) O(n)比sa快啊

代码

Part 2

lyndon \text{lyndon} lyndon分解的应用:

1.3 1.3 1.3 给定长为 n n n的字符串 S S S,求出 S S S的最小表示法。

方法:将 S S SS SS lyndon \text{lyndon} lyndon分解,找到分解后最后一个字符串,它的首字符为 S S [ p ] SS[p] SS[p],且 p ∈ [ 0 , ∣ S ∣ ) p\in [0,|S|) p[0,S)。可以证明 S S [ p : p + ∣ S ∣ − 1 ] SS[p:p+|S|-1] SS[p:p+S1]是字典序最小的。(运用第一条引理,转化为比较在原串中的后缀,即sa)

1.4 1.4 1.4 给定长度为 n n n的字符串 S S S,将 S S S分为最多 k k k个串 c 1 c 2 . . . c k c_1c_2...c_k c1c2...ck,求 max ⁡ c i \max c_i maxci的最小值。

方法:看到字典序,容易想到 lyndon \text{lyndon} lyndon分解。首先把 S S S lyndon \text{lyndon} lyndon分解成 s 1 , . . . , s g s_1,...,s_g s1,...,sg,如果 k ≥ g k\ge g kg,那么答案即为 s 1 s_1 s1;否则,如果 s 1 > s 2 s_1>s_2 s1>s2,那么显然可以分成 s 1 s_1 s1和剩下的所有串,答案还是 s 1 s_1 s1。因此,考虑分解成 s 1 m s g s_1^ms_g s1msg的情况,如果 k > m k>m k>m,那么答案还是 s 1 s_1 s1,如果 k ≤ m k\le m km,那么尽量均分一下即可。

推广:多次询问,每次询问 S S S的一段后缀的答案。

考虑求出原串的sa数组,显然可以求出第一项以及重复次数(可以用哈希),这样就做完了。

1.5 1.5 1.5 S S S的每个前缀的字典序最小的后缀

首先把 S S S lyndon \text{lyndon} lyndon分解成 s 1 , . . . , s g s_1,...,s_g s1,...,sg,显然 s 1 . . . s k s_1...s_k s1...sk的字典序最小的后缀是 s k s_k sk。但是前缀取到分解出来的 lyndon \text{lyndon} lyndon串半截时,答案可能不一样。

考虑 duval \text{duval} duval算法求 lyndon \text{lyndon} lyndon分解的过程,分类讨论:

  • s [ k ] > s [ j ] s[k]>s[j] s[k]>s[j],此时 a n s [ k ] ans[k] ans[k]应该等于 i i i,因为 s [ i : k ] s[i:k] s[i:k]构成一个新的 lyndon \text{lyndon} lyndon
  • s [ k ] = s [ j ] s[k]=s[j] s[k]=s[j],此时 a n s [ k ] = a n s [ j ] + k − j ans[k]=ans[j]+k-j ans[k]=ans[j]+kj
  • s [ k ] < s [ j ] s[k]<s[j] s[k]<s[j],在 lyndon \text{lyndon} lyndon串开头时更新(或者说在之后的 lyndon \text{lyndon} lyndon串中更新)

1.6 1.6 1.6 S S S的每个前缀的字典序最大的后缀

首先把字符比较反过来,然后要尽量向左取,当 s [ k ] ≤ s [ j ] s[k]\le s[j] s[k]s[j]的时候, s [ i : k ] s[i:k] s[i:k]这一段都保持了是一个近似 lyndon \text{lyndon} lyndon串,所以都取近似 lyndon \text{lyndon} lyndon串的左端点 i i i作为答案即可。

ps:感觉这个算法就只能考论文题。。。太恶心了。。。

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

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

相关文章

连接Redis报错解决方案

连接Redis报错&解决方案 问题描述&#xff1a;Could not connect to Redis at 127.0.0.1:6379: 由于目标计算机积极拒绝&#xff0c;无法连接。 问题原因&#xff1a;redis启动方式不正确 解决方案&#xff1a; 在redis根目录下打开命令行窗口&#xff0c;输入命令redi…

【SpringBoot】分层解耦

1. 三层架构 Controller&#xff1a;控制层。接收前端发送的请求&#xff0c;调用Service层来进行逻辑处理&#xff08;Service层处理完后&#xff0c;把处理结果返回给Controller层&#xff09;Service&#xff1a;业务逻辑层。处理具体的业务逻辑。调用Dao层&#xff08;逻辑…

旺店通无代码API集成:电商平台的客服系统和营销自动化解决方案

无代码API集成的力量 在数字化转型的浪潮中&#xff0c;电商平台迅速崛起&#xff0c;成为企业不可或缺的销售和市场推广渠道。旺店通企业版奇门以其无代码开发的连接和集成能力&#xff0c;重塑了电商系统的运营模式。无需繁琐的API开发&#xff0c;企业即可实现电商平台与客…

AI:95-基于卷积神经网络的艺术品风格分类

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

第一课【习题】HarmonyOS应用/元服务上架

元服务发布的国家与地区仅限于“中国大陆” 编译打包的软件包存放在项目目录build > outputs > default下 创建应用时&#xff0c;应用包名需要和app.json5或者config.json文件中哪个字段保持一致&#xff1f; 发布应用时需要创建证书&#xff0c;证书类型选择什么…

csdn调整样式之居中、空格、换行、字体字号、自动生成目录

文章目录 1、居中2、空格3、换行4、字体字号5、[TOC](文章目录) 自动生成目录6、列表7、分割线8、引用代码 1、居中 <center>文字居中 2、空格 一个空格   &emsp;三个空格一个空格    三个空格 3、换行 <br>你好 4、字体字号 <font color red size…

# K近邻算法 度量距离

K近邻算法 度量距离 欧氏距离(Euclidean distance) 欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义&#xff0c;指在 m m m维空间中两个点之间的真实距离&#xff0c;或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点…

Kubernetes创始人发声!K8s 变得太复杂了

关注【云原生百宝箱】公众号&#xff0c;获取更多云原生消息 Kubernetes 变得太复杂了&#xff0c;它需要学会克制&#xff0c;否则就会停止创新&#xff0c;直至丢失大本营。 Kubernetes 联合创始人Tim Hockin 罕见发声。在今年的 KubeCon 上&#xff0c;他建议&#xff0c;K…

【Altera】Quartus II 软件怎么更改bank电压

前言 FPGA的bank电压要和物理设计相同&#xff0c;Quartus II 软件怎么更改bank电压&#xff1f; 步骤 启动 Pin Planner&#xff08;快捷方式&#xff1a;CTRL Shift N&#xff09;右键单击 Pin Planner 的背景&#xff0c;然后选择"显示 I/O bank"。右键…

学习git后,真正在项目中如何使用?

文章目录 前言下载和安装Git克隆远程仓库PyCharm链接本地Git创建分支修改项目工程并提交到本地仓库推送到远程仓库小结 前言 网上学习git的教程&#xff0c;甚至还有很多可视化很好的git教程&#xff0c;入门git也不是什么难事。但我发现&#xff0c;当我真的要从网上克隆一个…

Vue:Vue的开发者工具不显示Vue实例中的data数据

一、情况描述 代码&#xff1a; 页面&#xff1a; 可以看到&#xff0c;input获取到了data数据&#xff0c;但是&#xff0c;vue-devtool没有获取到data数据 二、解决办法 解决办法1&#xff1a; data.name的值不能全是中文&#xff0c;比如改成aa尚硅谷 解决办法2&…

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库

Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库 文章目录 Windows下使用AndroidStudio及CMake编译Android可执行程序或静态库动态库一、前言二、编译环境三、示例C/CPP程序1、总体工程结构2、示例代码3、CMakeLists.txt&#xff08;重要&#xff09;4、…

【外观模式】SpringBoot集成mail发送邮件

前言 发送邮件功能&#xff0c;借鉴 刚果商城&#xff0c;根据文档及项目代码实现。整理总结便有了此文&#xff0c;文章有不对的点&#xff0c;请联系博主指出&#xff0c;请多多点赞收藏&#xff0c;您的支持是我最大的动力~ 发送邮件功能主要借助 mail、freemarker以及rocke…

包装类, 泛型---java

目录 一. 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱 二. 泛型 2.1什么是泛型 2.2泛型的引入 2.3 泛型类语法 2.4 泛型类的使用 2.5 裸类型(Raw Type)(了解) 2.6 泛型是如何编译的 2.7 泛型的上界 2.8 泛型方法 一. 包装类 在 Java 中&#xff0c;由于基本…

爱智EdgerOS之深入解析AI图像引擎如何实现AI视觉开发

一、前言 AI 视觉是为了让计算机利用摄像机来替代人眼对目标进行识别&#xff0c;跟踪并进一步完成一些更加复杂的图像处理。这一领域的学术研究已经存在了很长时间&#xff0c;但直到 20 世纪 70 年代后期&#xff0c;当计算机的性能提高到足以处理图片这样大规模的数据时&am…

DSP处理器及其体系结构特点(您都用过哪些DSP?)

DSP处理器概述 数字信号处理器&#xff08;Digital Signal Processor&#xff0c;DSP&#xff09;是一种专门设计用于执行数字信号处理任务的微处理器类型。与通用微处理器&#xff08;如CPU&#xff09;相比&#xff0c;DSP处理器在处理数字信号时具有更高的性能和效率。 用途…

JAVA程序如何打jar和war问题解决

背景: 近期研究一个代码审计工具 需要jar包 jar太多了 可以将jar 打成war包 首先看下程序目录结构 pom.xml文件内容 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"ht…

数据库后门是什么?我们要如何预防它的危害

数据库后门是黑客在数据库中安装的一种特殊程序或代码&#xff0c;可以绕过正常的认证和授权机制&#xff0c;从而获取数据库的敏感信息或者控制整个数据库。黑客可以通过各种方式安装后门&#xff0c;比如利用漏洞、钓鱼、社会工程学等。 数据库后门的危害主要体现在以下几个方…

GPTs应用:创新无限,生态扩容

今天分享的GPTs系列深度研究报告&#xff1a;《GPTs应用&#xff1a;创新无限&#xff0c;生态扩容》。 &#xff08;报告出品方&#xff1a;华泰证券&#xff09; 报告共计&#xff1a;20页 GPTs 发展现状&#xff1a;从 AI 工具到开发平台&#xff0c;掀起全民开发浪潮 11…

YOLOv5独家原创改进:SPPF自研创新 | 可变形大核注意力(D-LKA Attention),大卷积核提升不同特征感受野的注意力机制

💡💡💡本文自研创新改进: 可变形大核注意力(D-LKA Attention)高效结合SPPF进行二次创新,大卷积核提升不同特征感受野的注意力机制。 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合p…