Lyndon 分解 小记

参考:IOI2021 国家集训队论文 胡昊

以下表示字符串的下标都是 [0,|S|1],设 n 为最后一项下标也就是 |S|1

定义

  • 定义简单串 Si[1,|S|1],S[i,n]>S,也即 任意真后缀大于 S
  • 定义串 S 的 lyndon 分解为 S=w1w2wm,其中满足 wiwi+1 且所有的 wi 均为简单串

性质

  1. S 是简单串,当且仅当小于所有与它循环同构的串

    1. S 是简单串,破环成链之后 i1,S[i,n]>SS[i,n+i1]>S

    2. S 小于与它循环同构的所有串,则不妨考虑反证法,设:

    S=A+B,其中 B 是最短的 SB 的后缀,则根据假设,BA>S,也即 BA>ABB

    这可以导出 A,B 存在前缀关系

    1. AB 的前缀,不妨设 B=AC,那么有 ACA>AACACCA>ACC

      又因为 B 是所有串里面最短的,所以这个 C 应当满足 S<C 也就是 ACAAC<C

      所以可以得到 CAC<C,显然不成立

    2. BA 的前缀,不妨设 A=BC,那么有

      BBC>BCBB,也就有 BC>CB

      又因为 S=BCB<CBB,这是矛盾的。

  2. S+a 是简单串,则 b>aS+b 也是简单串

    对于每个真后缀 T,有 Tb>Ta>Sa,|Tb|<|Sa|,所以对于 S 的每个真后缀与 S 比较的不同位置涉及不到最后一个位置,所以 Tb>Sb

  3. Lyndon 分解是唯一的

    不妨假设 S 存在两个 Lyndon 分解,我们删去两个分解开头相同的部分,只剩下 w1w2wm,w1w2wm

    那么不妨设 |w1|<|w1|,则设 w1=A,w1=AB,w2=BC,根据 w2w1,以及循环同构最小,可以有:

    BCA<AB<B

    这显然矛盾

后缀 Lyndon 分解

考虑使用后缀数组对所有后缀进行排序,设 ai=minj>i,S[j,n]<S[i,n]j 如果不存在设置 j=n+1=|S|,这个可以利用数据结构轻松求出。

那么可以给出 Lyndon 分解为 [0,a01][a0,aa01]

证明感性?其实 wiwi+1 是容易看出的,我们只需要证明 wi 是简单串即可。这也是简单的,根据后缀排序可得。

前缀 Lyndon 分解-Duval 算法

定义近似简单串 S=wkw0,其中 wkw 重复 k 次所得,且 w0w 的前缀。

显然简单串也是近似简单串。

考虑使用三个指针 i,j,k 表示:[0,i1] 已经处理,[i,j1] 是一个近似简单串 wkw0,而 kj|w|

分类讨论:

  • Sj=Sk,显然直接扩展即可,jj+1,kk+1

  • Sj>Sk,可以发现此时 [i,j] 是一个简单串,可以看成近似简单串,也就是 jj+1,ki

  • Sj<Sk,可以发现此时 w0Sj 已经小于 w 了,直接把 wx 划出来变成一个新的 w

    也就是不断填入 w,|w|=jk,直到 i>k

    ii,ji+1,ki,因为单个字符也算近似简单串

咕了

题目应用

最小表示法

最小划分

前缀最小后缀

JSOI2019 节日庆典

EC Final 2022 Minimum Suffix

posted @   spdarkle  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示