Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

    • AC自动机学习笔记
    • KMP/扩展KMP学习笔记
    • Lyndon分解学习笔记
      • 引理1. 若$u,v$都是Lyndon串且$u<v$,则$uv$也是Lyndon串
      • 引理2. Lyndon分解存在且唯一
      • 引理3. 若串$v$与字符$c$满足$vc$是某个Lyndon串的前缀,则对于字符$d>c$,$vd$是Lyndon串
      • Duval 算法
        • 例题: 洛谷 P6114
    • Manacher学习笔记
    • 后缀数组
    • 后缀自动机学习笔记
    • 回文树
    • 子序列自动机
    • 字符串基础
  • 几何

  • 博弈论

  • 其他

Lyndon分解学习笔记

# Lyndon 串 (Lyndon word)

一个串是 Lyndon 串,当且仅当这个串的最小后缀就是这个串本身。

在 Wiki 上还有另外一个等价的定义:串SSS是其所有循坏位移中最小的一个。(见Wiki (opens new window))

# Lyndon 分解

将字符串SSS分解成S=s1s2⋯smS=s_1s_2\cdots s_mS=s1​s2​⋯sm​,使得所有sis_isi​都为 Lyndon word,且∀1≤i≤m,si≥si+1\forall 1\le i\le m,s_i\ge s_{i+1}∀1≤i≤m,si​≥si+1​。

注意:在本文中,所有对字符串进行的+操作均代表连接两个字符串

# 引理1. 若u,vu,vu,v都是Lyndon串且u<vu<vu<v,则uvuvuv也是Lyndon串

  1. 若∣u∣≥∣v∣\mid u\mid \ge \mid v\mid∣u∣≥∣v∣

    ​ 显然u[:∣v∣]<vu[:\mid v\mid]<vu[:∣v∣]<v,因此uv<vuv<vuv<v。

  2. 若∣u∣<∣v∣\mid u\mid <\mid v\mid∣u∣<∣v∣

    1. uuu为vvv的前缀时,若v<uvv<uvv<uv,则有v[∣u∣+1:]<vv[\mid u\mid + 1:]<vv[∣u∣+1:]<v,矛盾
    2. uuu不为vvv的前缀时,显然

易得u[i:]+v>u+v(i>0)u[i:] + v > u + v\ (i>0)u[i:]+v>u+v(i>0)。

由于v>uvv>uvv>uv,且vvv为Lyndon串,因此vvv的所有后缀都大于uvuvuv。

# 引理2. Lyndon分解存在且唯一

初始令 m=∣S∣m=|S|m=∣S∣ 并且 Ai=S[i],A_{i}=S[i],Ai​=S[i], 然后每次不断找到 Ai<Ai+1A_{i}<A_{i+1}Ai​<Ai+1​ 并且合并为一个串(由引理1可知,合并后的串为仍为Lyndon串)。最后一定能使得所有的 Ai≥Ai+1A_{i} \geq A_{i+1}Ai​≥Ai+1​ 。

存在性得证。


假设存在两个Lyndon分解,分别为

Sn=s1s2⋯sisi+1⋯sm1Sn=s1s2⋯si′si+1′⋯sm2′\begin{aligned}S_n &= s_1 s_2 \cdots s_i s_{i+1} \cdots s_{m_1} \\S_n &= s_1 s_2 \cdots s'_i s'_{i+1} \cdots s'_{m_2} \end{aligned} Sn​Sn​​=s1​s2​⋯si​si+1​⋯sm1​​=s1​s2​⋯si′​si+1′​⋯sm2​′​​

不妨令∣si∣>∣si′∣\mid s_i\mid>\mid s'_i\mid∣si​∣>∣si′​∣,则si=si′si+1′⋯sj−1′+sj′[:l](l≤∣sj′∣)s_i=s'_i s'_{i+1}\cdots s'_{j-1} + s'_{j}[:l]\ (l\le\mid s'_j\mid)si​=si′​si+1′​⋯sj−1′​+sj′​[:l](l≤∣sj′​∣),且si′<sis'_i<s_isi′​<si​

由Lyndon性质可知:si<sj′[:l]s_i<s'_j[:l]si​<sj′​[:l]

又因为sj′[:l]s'_j[:l]sj′​[:l]为sj′s'_jsj′​的前缀,因此sj′[:l]≤sj′s'_j[:l]\le s'_jsj′​[:l]≤sj′​

根据划分(2)(2)(2),可知sj′≤si′s'_j\le s'_isj′​≤si′​

最终得到“不等式”:si′<si<sj′[:l]≤sj′≤si′s'_i<s_i< s'_j[:l]\le s'_j\le s'_isi′​<si​<sj′​[:l]≤sj′​≤si′​,“不等式”矛盾。

唯一性得证。

# 引理3. 若串vvv与字符ccc满足vcvcvc是某个Lyndon串的前缀,则对于字符d>cd>cd>c,vdvdvd是Lyndon串

设该Lyndon串为v+c+tv+c+tv+c+t,则v[i:]+c+t>v+c+t(i>0)v[i:]+c+t>v+c+t\ (i>0)v[i:]+c+t>v+c+t(i>0),因此v[i:]+d>v+d>v+c+tv[i:]+d>v+d>v+c+tv[i:]+d>v+d>v+c+t。

又因为c>v[0]c>v[0]c>v[0],因此d>v+dd>v+dd>v+d。

故v+dv+dv+d为Lyndon串。

# Duval 算法

维护3个指针i,j,ki,j,ki,j,k。

  • S[:i−1]=s1s2⋯sgS[:i-1]=s_1s_2\cdots s_gS[:i−1]=s1​s2​⋯sg​为已经固定的(处理好了的)分解。
  • S[i,k−1]=th+vS[i,k-1]=t^h + vS[i,k−1]=th+v为尚未固定的分解,满足串ttt是Lyndon串,vvv为ttt的可为空的前缀且v≠tv\ne tv=t。

当前读入S[k]S[k]S[k],令j=k−∣t∣j=k-\mid t \midj=k−∣t∣

  • 若S[k]>S[j]S[k]>S[j]S[k]>S[j],由于vvv为ttt的前缀,根据引理3可知,v+S[k]v+S[k]v+S[k]为Lyndon串。

    但此时若单独划分出v+S[k]v+S[k]v+S[k],并不能满足si≥si+1s_i\ge s_{i+1}si​≥si+1​的划分要求,因此要与前面所有ttt合并。

    最终得到新的Lyndon串t′=th+v+S[k]t' =t^h+v+S[k]t′=th+v+S[k] 。但此时不能确定该串是否为一个独立的划分。

  • 若S[k]=S[j]S[k]=S[j]S[k]=S[j],可知周期继续,令k=k+1,j=j+1k=k+1,j=j+1k=k+1,j=j+1即可。

  • 若S[k]<S[j]S[k]<S[j]S[k]<S[j],显然th+v+S[k]t^h+v+S[k]th+v+S[k]不是Lyndon串,此时前面ttt的分解固定了,算法从vvv的开头继续。

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

# 例题: 洛谷 P6114

给定一个串SSS,求其Lyndon划分,并输出一个整数,代表所有右端点(1-indexed)的异或和。

AC代码

#include <bits/stdc++.h>
using namespace std;

const int maxn = 5e6 + 1000;

char s[maxn];
int len, ans = 0;

signed main(){
    cin >> (s + 1);
    len = strlen(s + 1);

    int i = 1, j, k;
    while(i <= len){
        j = i, k = i + 1;
        while(k <= len && s[k] >= s[j]){
            j = (s[k]==s[j])?j+1:i;
            k++;
        }
        while(i <= j){ // j < 串v开头的位置
            ans ^= i + (k - j) - 1;
            i += k - j; // k - j: 循环节长度
        }
    }
    cout << ans << '\n';
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 参考

  • 题解 P6127 (opens new window)
  • 题解 P6114 (opens new window)
  • Wiki (opens new window)
上次更新: 2021/02/24, 03:37:30
KMP/扩展KMP学习笔记
Manacher学习笔记

← KMP/扩展KMP学习笔记 Manacher学习笔记→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式