Lyndon & Runs 更新于 2026/5/28 07:35:24 作者

command_block

读者可能需要前往 Border理论小记 学习相关知识,否则可能无法理解某些内容。

本文包含的内容 :

  • Lyndon 分解

  • Lyndon 树 (未完)

  • The Runs Theorem

  • 本原平方串 primitive square

参考资料 :

其中,前者的部分内容是后者的翻译。

0. 初步的定义 & 约定

字符串一般记为小写字母,确定的字符用 abcdef\texttt{abcdef} 字体表示,单独的不定字符用 a\overline a 表示。

对于字符串 ss ,有如下概念。

  • 长度 :记为 s|s| ,在针对单串集中的讨论中也约定为 nn。( 本节下面一律有 n=sn=|s|

  • 字符 :用 s[i]s[i] 表示串 ss 的第 ii 个字符。ss 中的字符标号为 1,2,,n1,2,\dots,n

    单个字符也被视作字符串。

  • 字符集 : 记为 Σs\Sigma_s

    为了简化边界条件,若取到标号在 [1,n][1,n] 之外的字符,定义其不在字符集内。

  • 字符串的比较 : 若 ss 的字典序比 tt 小,记为 s<ts<t

    若字符串集合 DD 中的所有串都小于 ss ,记为 D<sD<s

    类似地有 ,>,\leq ,>,\geq

  • 子串s[l,r]s[l,r] 表示将 s[l],s[l+1],,s[r]s[l],s[l+1],\dots,s[r] 顺次连接而成的字符串。

  • 前缀&后缀 : 简记 si]=s[1,i], s[i=s[i,n]s\langle i]=s[1,i],\ s[i\rangle=s[i,n]。(注意里面填的是位置而非长度)

    称一个前缀/后缀为严格的,当且仅当它 原串 ss

    pre(s){\rm pre}(s)ss 的前缀集合, suf(s){\rm suf}(s)ss 的后缀集合。

    pre(s){\rm pre}'(s)ss 的严格前缀集合, suf(s){\rm suf}'(s)ss 的严格后缀集合。

  • 出现位置 : 对于串 tt ,记:

    Begs(t){\rm Beg}_s(t)ttss 中所有出现位置的左端点集合。

    Ends(t){\rm End}_s(t)ttss 中所有出现位置的右端点集合。

    对于区间集合 LL ,类似地记 :

    Beg(L){\rm Beg}(L)LL 的左端点集合。

    End(L){\rm End}(L)LL 的右端点集合。

  • 字符串的拼接,幂 : 记 st, stst,\ s\cdot t 为字符串 s,ts,t 顺次连接而得的串。

    定义 sk=sss共 k 个s^k=\overbrace{ss\dots s}^{\text{共 k 个}} ,即 ss 重复 kk 次后形成的串。

  • 循环节 period\bf period : 若对于所有 1inc1\leq i\leq n-c ,均有 s[i]=s[i+c]s[i]=s[i+c] ,则称 ccss 的一个循环节。

    cnc|n 则称 cc 为整周期。

    period(s){\rm period}(s)ss 的循环节集合。

  • Border\bf Border : 若有 si]=s[ni+1 (1i<n)s\langle i]=s[n-i+1\rangle\ (1\leq i<n)(等于后缀的严格前缀),则称之为 Border\rm Border ,简称为 Bd\rm Bd

    Bd(s){\rm Bd}(s)ssBd\rm Bd 集合。( 注意 s∉Bd(s)s\not\in {\rm Bd}(s)

    Bd\rm Bdperiod\rm period 是一一对应的。其中,一个长度为 kkBd\rm Bd对应一个长度为 nkn-k 的循环节。

  • Lyndon Word\bf Lyndon\ Word : 若字符串 ss 的最小后缀是其本身,即 s<suf(s)s<{\rm suf}'(s) ,则称之为 LyndonWord\rm Lyndon Word ,简称为 Ly\rm Ly

    另一个等价的定义 : ss 是自己的所有循环位移中最小的一个。

    例 : abc,ababc\texttt{abc,ababc}Ly\rm Ly,而 ba,acabc\texttt{ba,acabc} 不是。

  • Runs\bf Runs : 三元组 r=(l,r,p){\bf r}=(l,r,p) 是串 ss 的一个 run\rm run ,当且仅当 :

    • s[l,r]s[l,r]最小循环节为 pp ,满足 2ps[l,r]=rl+12p\leq \big|s[l,r]\big|=r-l+1

    • 该循环不能延伸,即 s[l1]s[l+p1],s[r+1]s[rp+1]s[l-1]≠s[l+p-1],s[r+1]≠s[r-p+1]

    实数 er=rl+1pe_{{\bf r}}=\dfrac{r-l+1}{p} 被称为该 run\rm run 的指数。

    Runs(s){\rm Runs}(s)ss 的所有 run\rm run 构成的集合。

    ρrun(n)ρ_{\rm run}(n) 表示长度为 nn 的字符串中至多含有的 run\rm run 个数。

    σrun(n)σ_{\rm run}(n) 表示长度为 nn 的字符串的 run\rm run 的指数和的最大值。

为了方便,上面的约定了一些不正规的缩写,相信大家很容易就能感性理解。(逃)

1. Lyndon Word 的性质

在不能理解证明的时候,建议画图。在一些关键的地方我也会制作图示。

  • Δ\color{blue}\bf\Delta 定理(1.1) : 对于任意一个 Ly s{\rm Ly}\ s ,其不存在 Bd\rm Bd

若存在某个 Bd t{\rm Bd}\ t,则显然 t<st<s ,同时 tt 又是 ss 的严格后缀,和 Ly\rm Ly 的定义矛盾。

  • Δ\color{blue}\bf\Delta 定理(1.2) : 对于 Ly s=ab{\rm Ly}\ s=ab ,有 a<ba<b。(a,ba,b 均非空)

由定义有 ab<bab<b ,且显然有 a<aba<ab ,所以 a<ba<b

  • 引理(1.1) : 若 aa 不是 bb 的前缀,则 ac1<bc2a<bac_1<bc_2\Leftrightarrow a<b。证明较为显然,从略。

  • Δ\color{blue}\bf\Delta 定理(1.3) : 对于 Ly b{\rm Ly}\ b 和另一个串 aa, 有 a<bab<ba<b\Leftrightarrow ab<b

引理(1.1) ,若 aa 不是 bb 的前缀 ,则结论成立。

现在针对 Ly\rm Ly 来证明 aa 恰为 bb 前缀的情况。令 b=atb=at

显然有 a<ba<b ,所以必要性不必证明。

假设 at=b<abat=b<ab ,则有 t<bt<b ,由于 ttbb 的一个后缀,这违反 Ly\rm Ly 的定义,矛盾。

  • Δ\color{blue}\bf\Delta 定理(1.4) : ssLy\rm Ly 当且仅当 s=abs=aba<ba<ba,ba,b 均为 Ly\rm Ly。(a,ba,b 均非空,s2|s|\geq 2

这个定理告诉我们,Ly\rm Ly 总是由两个更小的 Ly\rm Ly 按字典序拼成的。

  • 充分性(a<b\big(a<ba,ba,b 均为 Ly)(ab{\rm Ly}\big)\Rightarrow\big(abLy)\rm Ly\big)

    abab 的严格后缀可以分为 suf(a)b, b, suf(b){\rm suf}'(a)b,\ b,\ {\rm suf}'(b) 两个部分。

    a<suf(a)a<{\rm suf}'(a) ,显然有 ab<suf(a)bab<{\rm suf}'(a)b

    定理(1.3)ab<b<suf(b)ab<b<{\rm suf}'(b) ,证毕。

  • 必要性(s\big(sLy)({\rm Ly}\big)\Rightarrow \big( 存在 ii 使得 si1]<s[is\langle i-1]<s[i\ranglesi1],s[is\langle i-1],s[i\rangle 均为 Ly)\rm Ly\big)。 (证明较为复杂,可暂时跳过)

    找出 ss 的最小严格后缀 s[is[i\rangle

    • Part1. 由 定理 (1.2) 即可得到 si1]<s[is\langle i-1]<s[i\rangle

    • Part2. s[is[i\rangleLy\rm Ly

      由最小严格后缀,不存在其他严格后缀比它还小,所以其是 Ly\rm Ly

    • Part3. si1]s\langle i-1]Ly\rm Ly

      假设前缀 si1]s\langle i-1] 存在长为 kkBd\rm Bd。显然 k+1<ik+1<i

      由最小严格后缀,可得 s[k+1>s[is[k+1\rangle>s[i\rangle,又因为 s[1,k]=s[ik,i1]s[1,k]=s[i-k,i-1] ,在这两个串后面分别接上不等式中的串,则有 s>s[iks>s[i-k\rangle ,与 Ly\rm Ly 的定义矛盾。所以, si1]s\langle i-1] 没有 Bd\rm Bd

      对于 1<ji11<j\leq i-1 ,考虑 $s\langle i-1]s[i\rangle=s<s[j\rangle=s[j,i-1]s[i\rangle$。

      引理(1.1) ,因为 si1]s\langle i-1]Bd\rm Bd ,即 s[j,i1]s[j,i-1] 不是 si1]s\langle i-1] 的前缀,可得 s[j,i1]>si1]s[j,i-1]>s\langle i-1] ,则 si1]s\langle i-1]Ly\rm Ly

  • Δ\color{blue}\bf\Delta 定理(1.5) : 若字符串 ss 和字符 x\overline x 满足 sxs\overline x 是某个 Ly\rm Ly 的前缀,则对于 y>x\overline y>\overline xsys\overline yLy\rm Ly

sxts\overline xtLy\rm Ly ,考虑 1<js1<j\leq |s|

s[jxs[j\rangle \overline xss 的前缀,则由 s[jx<s[jys[j\rangle \overline x<s[j\rangle \overline y (两者互不为前缀)使用 引理(1.1) 能导出 sy<s[jys\overline y<s[j\rangle \overline y

s[jxs[j\rangle \overline x 不是 ss 的前缀,考虑 s[jxt>sxts[j\rangle \overline xt>s\overline xt ,使用 引理(1.1) 替换后面的东西,即得 s[jy>sys[j\rangle \overline y>s\overline y

综上,总有 sy<s[jys\overline y<s[j\rangle \overline y ,证毕。

  • \large\color{blue}\bf\circledast 定义 : 串的 Lyndon\rm Lyndon 分解

将字符串 ss 分解成 s1,s2sms_1,s_2\dots s_m ,满足 s1,s2,,sms_1,s_2,\dots,s_m 均为 Ly\rm Ly ,且 s1s2sms_1\geq s_2\geq \dots\geq s_m

  • Δ\color{blue}\bf\Delta 定理(1.6) : Ly\rm Ly 分解唯一

假设 ss 有两种 Ly\rm Ly 分解 : s=s1s2sisms=s_1s_2\dots s_i\dots s_ms=s1s2sisms=s_1's_2'\dots s_i'\dots s_m'

ii 为第一个满足 sisis_i≠s_i' 的,不妨设 si>si|s_i|>|s_i'| ,且 si=sisi+1...sksk+1j]s_i=s_i's_{i+1}'...s_k's_{k+1}'\langle j]

有 $s_i<s_{k+1}'\langle j]\leq s_{k+1}'\leq s_{k}'\leq ...\leq s_i'<s_i$ ,矛盾。

  • Δ\color{blue}\bf\Delta 定理(1.7) : Ly\rm Ly 分解必然存在

开始时将 ss 分解为 nn 个串,每个串都只有一个字符。显然,单字符都是 Ly\rm Ly

接下来,若相邻的两个串满足 si<si+1s_i<s_{i+1} ,则合并。由 定理(1.4),合并后仍是 Ly\rm Ly

容易发现,合并不会一直进行下去,停止时得到的就是 Ly\rm Ly 分解。

2. 求 Lyndon 分解 : Duval 算法

前面在证明 Ly\rm Ly 分解存在性时,已经给出了一个构造,不过时间复杂度还不能令人满意。

不难发现,对于串 ss ,其唯一 Ly\rm Ly 后缀即为其最小后缀。每次取出最小后缀即可得到 Ly\rm Ly 分解。

这可以利用后缀数组求解,不过这样太复杂了。

接下来介绍 Duval\rm Duval 算法,其可以在 O(n)O(n) 的时间内算得一个串的 Ly\rm Ly 分解。且代码实现非常简短。

其思想是 : 不断求一个串的最长 Ly\rm Ly 前缀。

  • Δ\color{blue}\bf\Delta 定理(2.1) : 设 s=ukuas=u^ku'\overline a ,其中 uuLy\rm Lyuu'uu 的严格前缀,a\overline a 是某个字符,且 u[u+1]≠u\big[|u'|+1\big](接不上 uu 的循环)。

  • ① 若 a>u[u+1]\overline a>u\big[|u'|+1\big] ,根据 定理(1.5) ,这说明 uau'\overline aLy\rm Ly

    由于此时 u<uau<u'\overline a ,可以将前面的 tct^c 全都合并。所以 ss 已经是一个 Ly\rm Ly 串。

  • ② 若 a<u[u+1]\overline a<u\big[|u'|+1\big] ,所有以 ss 开头的字符串,最长 Ly\rm Ly 前缀是 uu

    若选择 ukuu^ku' 的长度大于 u|u| 的前缀,则会产生 Bd\rm Bd ,矛盾。

    若选择 ukuatu^ku'\overline a t,由于 uau'\overline a 不是 uu 的前缀,使用 引理(1.1) 可得 $u'\overline a <u\Rightarrow u'\overline a t<u^ku'\overline a t$ ,则显然不是 Ly\rm Ly

.Duval\rm Duval 算法的主要过程是,在字符串中不断迭代,并不断保持 定理(2.1) 的形式。

维护两个指针 p,ip,i ,其中 s[1,p1]s[1,p-1] 的分解已经确定 ,s[p,i]s[p,i] 是目前的一段待定串。

维护 s[p,i]s[p,i]Ly\rm Ly 循环,设 s[p,i]=ucus[p,i]=u^cu',其中 tt 是一个 Ly\rm Ly 串,uu'uu 的严格前缀。需要维护 u,c,u|u|,c,|u'|

当加入字符 s[i+1]s[i+1] 时 :(若 k+1>nk+1>ns[k+1]=s[k+1]=-∞

  • s[i+1]=s[iu+1]s[i+1]=s[i-|u|+1] : 这说明目前的 Ly\rm Ly 循环可以延续下去。

  • s[i+1]>s[iu+1]s[i+1]>s[i-|u|+1] : 根据 定理(2.1)s[p,i+1]s[p,i+1]Ly\rm Ly,也是新的 uu

  • s[i+1]<s[iu+1]s[i+1]<s[i-|u|+1] : 根据 定理(2.1) ,此时的最长 Ly\rm Ly 前缀是 uu ,我们在确定的分解中加入 ccuu ,然后令 ii 回到新的 pp 处重来。

不难发现, i+pi+p 总是递增。①② 中仅有 ii 增加,③ 中由于 u<uk|u'|<|u^k| 所以 pp 的增加量大于 ii 的减少量。

所以,算法的时间复杂度为 O(n)O(n)

#include<cstring>
#include<cstdio>
char s[5005000];
int main()
{
  scanf("%s",s+1);
  int n=strlen(s+1);
  int p=0,i=1,u=1,c=1,u2=0,ans=0;
  for (;i<=n;i++){
    if (s[i+1]==s[i-u+1]){
      u2++;
      if (u2==u){c++;u2=0;}
    }
    else if (s[i+1]>s[i-u+1]){
      u=i+1-p; u2=0; c=1;
    }
    else if (s[i+1]<s[i-u+1]){
      for (int t=1;t<=c;t++)
        {p+=u;ans^=p;}
      i=p; u=1; c=1; u2=0;
    }
  }printf("%d",ans);
  return 0;
}

评测记录

  • 扩展应用

可以利用 Duval\rm Duval 算法求出 ss 的每个前缀的最小/最大后缀。

还可以求 ss 的最小表示,即求出最小的 T=S[iSi1]T=S[i\rangle S\langle i-1]

s=s+ss'=s+s ,求出 ss'Ly\rm Ly 分解,找到起始位置 s\leq |s| 且最小的 Ly\rm Ly 串,即为最小表示的开头。

先咕了。

3. Runs 的性质 : The Runs Theorem

  • Δ\color{blue}\bf\Delta 定理(3.1) : 两个周期为 pprun\rm run 的交长度 <p<p

若交的长度 p\geq p ,在交中选出一个循环节扩展,能导出矛盾。

  • \large\color{blue}\bf\circledast 定义 : run\rm runLyndon Root\text{Lyndon Root} (简称为 LyRoot\rm LyRoot

r=(l,r,p){\bf r}=(l,r,p) 是串 ss 的一个 run\rm run

一个长为 pp 的区间 [i,j][i,j] 被称为 LyRoot\rm LyRoot ,当且仅当 s[i,j]s[i,j]Ly\rm Ly ,且 lijrl\leq i\leq j\leq r

也就是说,LyRoot\rm LyRootrun\rm run循环节中最小的那些。

显然,对于任意的一个 r{\bf r} ,其至少有一个 LyRoot\rm LyRoot (循环节的最小表示)。且所有 LyRoot\rm LyRoot 代表的串相等(只是位置不同)。

  • Δ\color{blue}\bf\Delta 定理(3.2) : $\text{The Runs Theorem} : ρ_{\rm run}(n)<n,σ_{\rm run}(n)\leq 3n-3$

证明是一段漫长的旅程,请诸位耐心跋涉。路虽艰远,行之必达。

下面的定理理解跨度较大,叙述有些碎片化,正如不完整的拼图那样,让人一时摸不着头绪。

但在拼图完整的那一刻,将会呈现优美的宏观结构,此时就能更清晰的洞察 : 每一块拼图都有其意义和解释。

  • \large\color{blue}\bf\circledast 定义 : 字典序重载

对于 Σ\Sigma 中的一个全序关系 << ,可以定义出字典序 <<

假设有 Σ\Sigma 中两种相反的全序关系 <0,<1<_0,<_1 ,可以定义出两种相反的字典序 <0,<1<_0,<_1。你可以认为 <0<_0 就是普通的字典序。

为了避免矛盾,在字符串比较时,我们自动在串后面填充无限个占位符 $∉Σ\texttt{\textdollar} \not\in \Sigma

对于 aΣ\overline a\in\Sigma 约定 $<0a\texttt{\textdollar}<_0\overline a (普通字典序中空位最小),a<1$\overline a<_1\texttt{\textdollar} (反字典序中空位最大)

对于不同的字典序比较方法,可以定义出不同的 Ly\rm Ly

f{0,1}f\in\{0,1\} ,记 ¬f=1f\neg f=1-f

  • \large\color{blue}\bf\circledast 定义 : 对于串 ss,定义 Lys,f(i)=[i,j]{\rm Ly}_{s,f}(i)=[i,j] 其中 j=max{js[i,j]是关于<fLy}j=\max\{j|s[i,j]\text{是关于}<_f\text{的}{\rm Ly}\}

也就是说,在 <f<_f 意义下,串 ss 中起始位置为 ii 的最长的 Ly\rm Ly 子串。

  • Δ\color{blue}\bf\Delta 定理(3.3) : 对于Lys,f(i){\rm Ly}_{s,f}(i),有且仅有一个 f{0,1}f\in\{0,1\} 使得 ${\rm Ly}_{s,f}(i)=[i,i],{\rm Ly}_{s,\neg f}(i)=[i,j]\ (j>i)$

也就是说,正反两种字典序之中,只有一个能导出非平凡 Ly\rm Ly 子串。

k=min{ks[k]s[i],k>i}k=\min\{k|s[k]≠s[i],k>i\} (第一个不同字符,由于串末有 $\texttt{\textdollar} ,必然能找到),找出 ff 满足 s[k]<fs[i]s[k]<_fs[i]

定理(2.1) ,不难得到 Lys,f(i)=[i,i]{\rm Ly}_{s,f}(i)=[i,i] ,以及 Lys,¬f(i)=[i,j],jk>i{\rm Ly}_{s,\neg f}(i)=[i,j],j\geq k>i(已经有 s[i,k]s[i,k] 作为 Ly\rm Ly 前缀)。

  • Δ\color{blue}\bf\Delta 定理(3.4) : 令 r=(l,r,p){\bf r}=(l,r,p) 是串 ss 的一个 run\rm run ,找出 f{0,1}f\in\{0,1\} 满足 s[r+1]<fs[r+1p]s[r+1]<_fs[r+1-p],则 rr 的所有关于 <f<_fLyRoot λ=[i,j]{\rm LyRoot}\ λ=[i,j] 都与 Lys,f(i){\rm Ly}_{s,f}(i) 相等。

我们知道 LyRoot\rm LyRoot 就是 r{\bf r}Ly\rm Ly 循环节,设一个循环节为 uu ,将 s[l,r]s[l,r] 写作 ukuu^ku' ,其中 uu'uu 的一个严格前缀。

不难发现,该定理就是 定理(2.1) 的体现。

定理(3.3) ,如果使用 <¬f<_{\neg f} ,那么总有 Lys,¬f(i)=[i,i]{\rm Ly}_{s,\neg f}(i)=[i,i] ,没多大意义。

因此,ff 有其特殊性,记 <f<_fr{\bf r} 的“正序”。

  • \large\color{blue}\bf\circledast 定义 : 对于 run r=(l,r,p){\rm run}\ {\bf r}=(l,r,p),记 ${\rm LyR}({\bf r})=\{λ=[i,j]\big|λ\text{为}{\bf r}\text{的关于}<_f\text{的}{\rm LyRoot},i≠l\}$,其中 ffr{\bf r} 的正序。

LyR(r){\rm LyR}({\bf r}) 表示 rr 的所有正序的 LyRoot\rm LyRoot ,但要除去开头位置 ll 出开始的(如果有的话)。

显然 $|{\rm LyR}({\bf r})|\geq \lfloor e_{\bf r}-1\rfloor\geq 1$。

  • Δ\color{blue}\bf\Delta 定理(3.5) : 对于串 ss 的两个不同的 run r=(l,r,p),r=(l,r,p){\rm run}\ {\bf r}=(l,r,p),{\bf r}'=(l',r',p') ,有 ${\rm Beg}({\rm LyR}({\bf r}))∩{\rm Beg}({\rm LyR}({\bf r}'))=\varnothing$。

假设存在 $i\in {\rm Beg}({\rm LyR}({\bf r}))∩{\rm Beg}({\rm LyR}({\bf r}'))$ ,且有 ${\rm LyRoot}\ λ=[i,j]\in{\rm LyR({\bf r})},\ λ=[i,j']\in{\rm LyR({\bf r}')}$

<f<_fr{\bf r} 的正序,则 λ=Lys,f(i)λ={\rm Ly}_{s,f}(i)

不难发现一定有 λλλ≠λ'λ=λr=rλ=λ'\Rightarrow {\bf r}={\bf r}' ),所以只能是 λ=Lys,¬f(i)λ'={\rm Ly}_{s,\neg f}(i)

定理(3.3)λ,λλ,λ' 必有一个为 [i,i][i,i] ,不妨设 λ=[i,i]λ=[i,i] ,则有 j>ij'>i

由于 s[i,j]s[i,j']Ly\rm Ly ,所以 s[i]s[j]s[i]≠s[j']

定理(3.4) 可知,rr 的循环节 p=λ=1p=|λ|=1rr' 的循环节 p=λ=ji+1p'=|λ'|=j'-i+1

LyR(r){\rm LyR}(r) 的定义,r,rr,r' 的左端点都 <i<i

由周期性可推得 s[i]=s[i1]=s[i1+(ji+1)]=s[j]s[i]=s[i-1]=s[i-1+(j'-i+1)]=s[j'] ,矛盾。证毕。

定理(3.5) 表明,run\rm run 们拥有两两不交的非空集合 Beg(LyR(r)){\rm Beg}({\rm LyR}({\bf r})),而且 11 不在其中,所以我们已经能够证明 ρrum(n)<nρ_{\rm rum}(n)<n

进一步写出 $\sum\limits_{{\bf r}\in {{\rm Runs}(s)}}|{\rm LyR}({\bf r})|\leq n-1$。

由 $e_{\bf r}-2\leq \lfloor e_{\bf r}-1 \rfloor\leq |{\rm LyR}({\bf r})|$ ,得 $\sum\limits_{{\bf r}\in {{\rm Runs}(s)}}e_{\bf r}-2\leq \sum\limits_{{\bf r}\in {{\rm Runs}(s)}}|{\rm LyR}({\bf r})|\leq n-1$

结合 Runs(s)n1|{\rm Runs}(s)|\leq n-1 ,即可得到 σrun(n)3n3σ_{\rm run}(n)\leq 3n-3

至此,我们证明了 定理(3.2) The Runs Theorem\text{The Runs Theorem}

  • 扩展ρrun,k(n)<n/(k1)ρ_{\rm run,k}(n)<n/(k-1) ,其中 ρrun,kρ_{\rm run,k} 指指数达到 kkrun\rm run 的个数。

若某个 run r{\rm run}\ {\bf r} 的指数达到 kk ,则 LyR(r)k1|{\rm LyR}({\bf r})|\geq k-1,利用 $\sum\limits_{{\bf r}\in {{\rm Runs}(s)}}|{\rm LyR}({\bf r})|\leq n-1$ 不难证明。

4. Runs 相关计算

在一些不必区分不同字典序的地方,会略去字典序参数 ff

  • Δ\color{green}\bf\Delta 模板Loj#173. Runs

  • 找出 Runs(s){\rm Runs}(s) : 暴力《优秀的拆分》

先枚举周期 pp ,在原串中每隔 pp 个位置撒一个关键点,一个 run\rm run 必然穿过至少两个关键点。

对相邻的两个关键点向前向后求 LCP\rm LCP ,若覆盖范围能连接,则找到一个可能的 run\rm run

可以利用 定理(3.1) 进行剪枝。

当然,目前枚举的周期 pp 不一定就是当前 run\rm run 的最小周期,所以需要按照 r=(l,r,p){\bf r}=(l,r,p) ,中的 (l,r)(l,r) 分类,每个类中保留一个 pp 最小的即可。

若使用字符串 Hash\rm Hash 实现,复杂度为 O(nlog2n)O(n\log^2n),可以使用后缀数组做到 O(nlogn)O(n\log n)

O(nlog2n)O(n\log^2n)评测记录 ( 能获得 8080',不剪枝只能得 6060'

  • 计算所有的 Lys(i){\rm Ly}_{s}(i)

维护每个后缀的 Ly\rm Ly 分解 s1s2sms_1s_2\dots s_m,取出 s1s_1 即可得到 Lys(i){\rm Ly}_{s}(i)。这需要不断向前加字符。

先将字符 c\overline c 当作一个 Ly\rm Ly 串插入到分解开头,然后若分解中 s1<s2s_1<s_2 则不断合并。正确性显然。

也就是说,我们只需要支持比较两个串的字典序,这可以随便 Hash\rm Hash 一手搞定。

更进一步地,根据 定理(1.3) 以及 引理(1.1) ,$s_1<s_2\Leftrightarrow s_1s_2<s_2\Leftrightarrow s_1s_2\dots s_m<s_2\dots s_m$

这就是说,我们把两个相邻 Ly\rm Ly 串的比较转化成了后缀的比较。这可以简化代码实现。

  • 找出 Runs(s){\rm Runs}(s) :利用性质

定理(3.3) ,一个 run\rm run 所含有的 Ly\rm Ly 循环节一定是某个字典序下某个后缀的最长 Ly\rm Ly 前缀。显然,两个不同的 run\rm run 不可能包含同一个循环节。

利用此条性质,我们可以不必暴力枚举循环节了,可选的循环节为 O(n)O(n) 个,分别前后求 LCP\rm LCP 即可。

形式化地,枚举 l,fl,f ,对于 Lys,f(l)=[l,r]{\rm Ly}_{s,f}(l)=[l,r],求出最长的 l1,l2l_1,l_2 使得 $s[l,l+l_1-1]=s[r,r+l_1-1],s[l-l_2,l-1]=s[r-l_2,r-1]$

l1+l2rl+1l_1+l_2\geq r-l+1 ,我们就找到了一个 run (ll2,r+l11,rl+1){\rm run}\ (l-l_2,r+l_1-1,r-l+1)

如图,两段绿色部分相等,一段紫色是一个 Ly\rm Ly 循环节。

l1+l2rl+1l_1+l_2\geq r-l+1 即要求绿色部分能连接起来,显然这是充要条件。

最终仍然要去重。

实现时,简便的 Hash\rm Hash 算法是个不错的选择。

O(nlogn)O(n\log n) : 评测记录 (有点卡常数,单模const了才过)

你可能对上述算法有这样的疑问 :Lyndon\rm Lyndon 串和字典序有关,Runs\rm Runs 只和匹配有关,为什么求 Runs\rm Runs 的算法对 Ly\rm Ly 理论有非常强的依赖性呢?

其实,Ly\rm Ly 串只是用于在循环串中确定一个最小循环节(某种意义上构造了映射),以简化求解。

5. Lyndon Tree

  • \large\color{blue}\bf\circledast 定义 : Ly\rm Ly 的标准分解。

定理(1.4) 告诉我们,Ly\rm Ly 总是由两个更小的 Ly\rm Ly 按字典序拼成的。

由此定义 Ly\rm Lyss 的标准分解为 s=abs=ab ,其中 bb 恰为 ss 的最小严格后缀。

定理(1.4) 的证明可知,a,ba,b 均为 Ly\rm Ly 串,且 a<ba<b

  • \large\color{blue}\bf\circledast 定义 : Lyndon Tree\text{Lyndon Tree}

Lyndon Tree\text{Lyndon Tree} 是一棵有根二叉树,每个节点代表一个 Ly\rm Ly 串。

根节点对应原串 ss ,要求 ss 是一个 Ly\rm Ly 串。

某个节点 tt 的两个儿子恰为 tt 的标准划分 t=abt=ab 中的 a,ba,b

若不能划分(只剩一个字符)则为叶子。

ss<f<_f 下的 Lyndon Tree\text{Lyndon Tree} 记为 LyTreef(s){\rm LyTree}_f(s)

(阅读上图的正确姿势 : 将子树内的所有字符顺次连接,即得到该节点代表的串)

一个显然的事实是,节点 u=[l,r]u=[l,r] 的子树中恰有叶节点 l...rl...r

实际上这玩意本质上是 SA\rm SArank\rm rank 数组的笛卡尔树。构造方法和前文计算 Lys(i){\rm Ly}_{s}(i) 的方法相同。

对于非 Ly\rm Ly 串,定义其 LyTree\text{LyTree} 为其 Ly\rm Ly 分解中各个串的 LyTree\rm LyTree 组成的森林。

  • Δ\color{blue}\bf\Delta 定理(5.1)lca([l,r]){\rm lca}([l,r])节点 l...rl...rLyTree\rm LyTree 上的 lca\rm lca

    ss 的子串 s[l,r]s[l,r]Ly\rm Ly ,则 u=lca([l,r])=[lu,ru]u={\rm lca}([l,r])=[l_u,r_u] ,满足 l=lurrul=l_u\leq r\leq r_u

l=rl=r 时显然成立,考虑 l<rl<r

v0=[lu,mu],v1=[mu+1,ru]v_0=[l_u,m_u],v_1=[m_u+1,r_u] 分别为 uu 的左右儿子。

LCA\rm LCA ,不难发现 lulmu<mu+1rrul_u\leq l\leq m_u<m_u+1\leq r\leq r_u

由此,可以将 s[lu,mu],s[l,r],s[mu+1,ru]s[l_u,m_u],s[l,r],s[m_u+1,r_u] 分别写成 ca,ab,bdca,ab,bd 的形式。(a,ba,b 非空,c,dc,d 可空)

(ca,bd)(ca,bd)s[lu,ru]=cabds[l_u,r_u]=cabd 的标准分解。

s[l,r]=abs[l,r]=abLy\rm Ly ,可得 ab<babd<bdab<b\Rightarrow abd<bd

cc 非空,则最小严格后缀可以是 abdabd 而不可能是 bdbd ,与标准分解的定义矛盾。因此 cc 必为空串,即 lu=ll_u=l

  • Δ\color{blue}\bf\Delta 定理(5.2) 从任一个 ll 开始的最长 Ly\rm Ly 子串 s[l,r]s[l,r] 必然在 ssLyTree\rm LyTree 中。

利用 定理(5.1) ,求 u=lca([l,r])=[l,r] (rr)u={\rm lca}([l,r])=[l,r']\ (r'\geq r)

又因为 s[l,r]s[l,r] 是最长的,所以只能是 r=rr'=r ,故树中的 uu 即为 s[l,r]s[l,r]

  • Δ\color{blue}\bf\Delta 定理(5.3) s[l,r]s[l,r]l (l>1)l\ (l>1) 开始的最长 Ly\rm Ly\Leftrightarrow 节点 u=lca([l,r])u={\rm lca}([l,r]) 是一个右儿子。

充分性 : 对于任意的 r>rr'>rs[l,r]s[l,r'] 都不是 Ly\rm Ly ,显然 s[l,r]s[l,r] 不可能是另一个 Ly\rm Ly 的标准分解的左半部分。

再根据 定理(5.2) ,其一定在树上,则只能是右儿子。

必要性 : 若 s[l,r]s[l,r] 不是 ll 开始的最长 Ly\rm Ly ,则存在 Ly s[l,r]{\rm Ly}\ s[l,r'] 满足 r>rr'>r

根据 定理(5.1) 可得存在 rr>rr''\geq r'>r 满足 lca([l,r])=s[l,r]{\rm lca}([l,r'])=s[l,r''] ,且显然为 s[l,r]s[l,r] 的祖先。

所以,s[l,r]s[l,r] 显然不可能为右儿子。(只能从 s[l,r]s[l,r''] 一串左链下来)

推论 : 结合 定理(3.4) ,对于任意一个 run r{\rm run}\ {\bf r} ,若其正序为 ff ,其所有 LyRoot\rm LyRoot 都在 LyTreef(s){\rm LyTree}_f(s) 的右儿子中出现。

  • 引理(5.1) Weak Periodicity Lemma\text{Weak Periodicity Lemma} : 若 p,qp,qss 的周期,且 p+qsp+q\leq |s| ,则 gcd(p,q)\gcd(p,q) 也是 ss 的周期。

证明见 Border理论小记。该引理简称为 WPL\rm WPL

  • 子串半周期查询

    题意 : 支持快速查询母串 ss 的某个子串是否有不超过长度一半的周期,如果有则求出最小周期。

exrun(l,r){\rm exrun}(l,r) 为满足 ll,rr,p(rl+1)/2l'\leq l,r\leq r',p\leq (r-l+1)/2 的一个 run r=(l,r,p){\rm run}\ {\bf r}=(l',r',p)

也就是说,能覆盖 [l,r][l,r] ,且循环节长度小于区间一半的 run\rm run

根据 WPL\rm WPL ,若 exrun(l,r){\rm exrun}(l,r) 存在则必然唯一,否则可以在 [l,r][l,r] 中构造更小的循环节。

这可以视作 定理(3.1) 的扩展 : 两个 ${\rm run}\ {\bf r_1}=(l_1,r_1,p_1),\ {\bf r_2}=(l_2,r_2,p_2)\ (p_1≠p_2)$ ,的交 <p1+p2<p_1+p_2 ,否则可以在相交的部分构造出更小的循环节 gcd(p1,p2)\gcd(p_1,p_2)

不难发现,子串半周期查询问题等价于求 exrun(l,r){\rm exrun}(l,r)

算法为 : 构造 LyTree0(s),LyTree1(s){\rm LyTree}_0(s),{\rm LyTree}_1(s) ,分别找到 $a_0={\rm lca}_0\Big(\big[l,\lceil (l+r)/2\rceil\big]\Big),a_1={\rm lca}_1\Big(\big[l,\lceil (l+r)/2\rceil\big]\Big)$ ,检查其右儿子作为 LyRoot\rm LyRoot 对应的 run\rm run 是否满足条件。

正确性证明 :

假设有 r=exrun(l,r)=(l,r,p){\bf r}={\rm exrun}(l,r)=(l',r',p) ,由于 p(rl+1)/2p\leq (r-l+1)/2 一定存在一个 LyRoot λ=[iλ,jλ]{\rm LyRoot}\ λ =[i_λ ,j_λ] 包含 (l+r)/2\lceil (l+r)/2\rceil 这个位置。

r{\bf }r 的正序为 ff ,根据 定理(5.3)λλLyTreef(s){\rm LyTree}_f(s) 中作为右儿子出现。

由 $a_f={\rm lca}_f\Big(\big[l,\lceil (l+r)/2\rceil\big]\Big)$ ,可得 afa_f 同样包含 (l+r)/2\lceil (l+r)/2\rceil 这个位置。且 afa_f 的长度 [l,(l+r)/2]\geq\big[l,\lceil (l+r)/2\rceil\big] 的长度 >p>p

综上不难推出 afa_fλλ 的祖先。

若其右儿子 b=[lb,rb]λb=[l_b,r_b]≠λ ,根据 LCA\rm LCA 的定义, bb 一定包含 (l+r)/2\lceil (l+r)/2\rceil 且不包含 ii,则 bb 也是 λλ 的祖先。

由于 λλ 都是右儿子,可得 i<lb<iλi<l_b<i_λ

rbrr_b\leq r' ,则 s[lb,rb]s[l_b,r_b] 有周期 pp ,与 Ly\rm Ly 矛盾。

rb>rr_b>r' ,由正序的定义有 s[r+1]<fs[r+1p]s[r+1]<_fs[r+1-p] ,则可以发现 s[lλ,rb]<fs[lb,rb]s[l_λ,r_b]<_fs[l_b,r_b],同样与 Ly\rm Ly 矛盾。

综上,λλ 必为 afa_f 的右儿子。

6. 本原平方串(primitive square)

  • \large\color{blue}\bf\circledast 定义 : 若一个串 ss 的最小周期恰为 s/2|s|/2 ,则称之为本原平方串,即 primitive square\text{primitive square}

    例 : abcabc\texttt{abcabc} 是本原平方串,而 abac,abababab\texttt{abac,abababab} 则不是。

  • 引理(6.1) : 若 aabb 的前缀,且 aapp 的循环节,bbqq 的循环节,pq, qap|q,\ q\leq |a| ,则 bb 也有 pp 的循环节。

显然。

  • 引理(6.2) 若非空串 s,ts,t 满足 sssstttt 的前缀,且 2s>t2|s|>t ,则 ts|t|-|s|ss 的周期。

画画图不难理解,这里略去严格证明。

  • Δ\color{blue}\bf\Delta 定理(6.1) : 若非空串 u,v,wu,v,w 满足 uuuuvvvv 的前缀,vvvvwwww 的前缀,且 uuuu 是本原平方串,则有 u+vw|u|+|v|\leq |w|

证明比较长,建议大家记下导出的不等式和每个串已经导出的周期,而且不要把不同情况的讨论弄混了。

w2vv+u|w|\geq 2|v|\geq |v|+|u| 则自然成立,所以只考虑 w<2v|w|<2|v| 的情况。

引理(6.2) 可得,wv|w|-|v|vv 的周期。

假设 u+v>wwv<u|u|+|v|>|w|\Rightarrow |w|-|v|<|u|,所以 wv|w|-|v| 也是前缀 uu 的周期。

2uv2|u|\leq |v| ,则 uuuuvv 的前缀,可推知 wv|w|-|v| 也是 uuuu 的周期。此时,则有周期 wv<u=uu/2|w|-|v|<|u|=|uu|/2 ,和本原平方串的定义矛盾。

2u>v2|u|>|v|,此时由 引理(6.2) 可得 vu|v|-|u|uu 的周期。

此外, u,wv|u|,|w|-|v|vv不同周期。但是,由于 vv 是本原平方串(长度超过一半的)的前缀,所以其是弱周期串(没有不超过长度一半的周期)。

若对一个串使用 WPL\rm WPL ,得到的循环节必然不超过长度一半(得到强周期串),所以可以否定其前提条件,即有 u+wv≰vu+w>2v|u|+|w|-|v|\not\leq |v|\Rightarrow |u|+|w|> 2|v|

vs1=w,u=s1s2,v=us3=s1s2s3vs_1=w,u=s_1s_2,v=us_3=s_1s_2s_3 ,则有 w=s1s2s3s1w=s_1s_2s_3s_1

$|u|+|w|> 2|v|\Rightarrow |s_1s_2|+|s_1s_2s_3s_1|> 2|s_1s_2s_3|\Rightarrow |s_1|>|s_3|$

$|u|+|v|>|w|\Rightarrow |s_1s_2|+|s_1s_2s_3|> |s_1s_2s_3s_1|\Rightarrow |s_2|>0$ (保证代换有意义)

uu,vv,wwuu,vv,ww 并排写出 :

$$\begin{aligned} &\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} \boxed{\phantom{|||}s_2\phantom{|||}} {\color{red}\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}}} \boxed{\phantom{|||}s_2\phantom{|||}}\\ &\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} {\color{red}\boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}}} \boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} {\color{red}\boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}}}\\ &\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} \boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}} \boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} {\color{red}\boxed{\phantom{|||||||||}s_1\phantom{|||||||||}}} \boxed{\phantom{|||}s_2\phantom{|||}} \boxed{\phantom{||||||}s_3\phantom{||||||}} \boxed{\phantom{|||||||||}s_1\phantom{|||||||||}} \end{aligned}$$

由红色部分可以得出,s2|s_2|s2s3s_2s_3 的周期。此外,s2s3s_2s_3u=s1s2u=s_1s_2 的前缀,所以也有周期 vu=s3|v|-|u|=|s_3|

使用 WPL\rm WPL 可得 s2s3s_2s_3 有周期 r=gcd(s2,s3)r=\gcd(|s_2|,|s_3|)。由 引理(6.1)uu 也有周期 rr

接下来考虑 u=s1s2u=s_1s_2 ,其周期有 wv=s1|w|-|v|=|s_1|rr ,而 rs2r\leq |s_2| ,所以继续使用 WPL\rm WPL 可得周期 r=gcd(r,s1)=gcd(s1,s2,s3)r'=\gcd(r,|s_1|)=\gcd(|s_1|,|s_2|,|s_3|)

这表明 uu 有非平凡整周期,和本原平方串的定义矛盾。证毕。

  • 推论① : 串 ss 中(位置不同的)本原平方串的个数不超过 O(slogs)O(|s|\log |s|)

    考虑每个开头位置,若有两个本原平方串 uu,vvuu,vv ,则下一个的长度至少为前两个的和(最劣为斐波那契),如此重复不超过 O(logn)O(\log n) 轮。

  • 推论② : 串 ss 中(本质不同的)本原平方串的个数不超过 O(s)O(|s|)

    考虑每个开头位置,若有三个本原平方串 uu,vv,ww(u<v<w)uu,vv,ww (|u|<|v|<|w|) ,则有 wu+v>2u|w|\geq |u|+|v|>2|u| ,所以 uuuu 在每个 ww 中都出现了一次,并不是在此处第一次出现,暂不统计。

    这样,每个开头位置出现的本质不同的本原平方串就至多两个。

    听说本质不同的平方串也是 O(s)O(|s|) 的。

  • Δ\color{blue}\bf\Delta 定理(6.2) : 每个本原平方串一定属于恰好一个和它周期对应的 run\rm run 的一部分。

某个本原平方串 uuuu 本身就足以成为一个周期为 u|u|run\rm run ,还可能可以向两边扩展,所以这样的 run\rm run 一定存在。

定理(3.1) ,不会有两个周期对应的 run\rm run 包含同一个本原平方串。

  • 找出本原平方串

定理(6.2) ,只需要对每个 run\rm run 找出其中所有本原平方串即可。

由最小循环节的性质,在 run r=(l,r,p){\rm run}\ {\bf r}=(l,r,p) 中, [l,r][l,r] 中任意连续长为 2p2p 的子串都是本原平方串。

寻找的复杂度也可以写成 $\sum\limits_{{\bf r}=(l,r,p)\in{\rm Runs(s)}}r-l+2-2p$ ,可得该式为 O(nlogn)O(n\log n) 量级。