1 条题解

  • 0
    @ 2025-8-24 22:22:50

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zghtyarecrenj
    心亦天天的了 夢天天的了 雖也未能料

    搬运于2025-08-24 22:22:50,当前版本为作者最后更新于2020-08-04 11:51:54,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    【模板】Runs 题解

    By zghtyarecrenj

    本文包括:Lyndon Words & Lyndon Array & Runs & Three Squares Lemma。

    禁止转载全文,转载部分需要注明出处。

    实在太长,已尽量删减(

    哇,你古md排版是不是出了点问题

    Lyndon tree 是一个非常有趣的东西,但是我现在还没有发现应用,所以先咕着。

    前言:Lyndon 相关知识是大毒瘤。

    0 Marks & Facts

    1. 我们定义两个字符串 aabb,如果 aa 的字典序 <b<b,则我们称 a<ba < b
    2. 如果 aabb 的前缀且 aba \ne b,则我们称 aba \sqsubset b
    3. 如果 aabb 的前缀,则我们称 aba \sqsubseteq b
    4. 如果 a<ba < baa 不是 bb 的前缀,则我们称 aba \triangleleft b。即 $a \triangleleft b \Longleftrightarrow (a < b) \wedge (a \not\sqsubseteq b)$。Fact:如果 aba \triangleleft b,则 au<bv{au} < {bv}
    5. abc{abc} 表示拼接 a,b,ca, b, c 三个字符串。
    6. ana^n 表示 nnaa 拼接在一起。e.g. a2b=aab{a^2b} = {aab}
    7. ϵ\epsilon 表示空串。
    8. 我们定义字符集为 Σ\Sigma,组成的字符串为 Σ\Sigma^*Σ+=Σ{ϵ}\Sigma^+ = \Sigma^* \setminus \{\epsilon\}
    9. pref(a)\operatorname{pref}(a) 表示所有 aa 的前缀的集合,suf(a)\operatorname{suf}(a) 表示所有 aa 的后缀的集合(包含 aaϵ\epsilon
    10. $\operatorname{pref}^+(a) = \operatorname{pref}(a) \setminus \{a,\epsilon\},\ \operatorname{suf}^+(a) = \operatorname{suf}^+(a) \setminus \{a, \epsilon\}$
    11. 若无特殊定义,字符串 ss 是从 00 开始。
    12. s|s| 表示 ss 的长度,s[i..j]s[i..j] 表示 ss 的一个子串,第一个字符的标号为 ii,最后一个字符的标号为 jj
    13. w^=w$\hat{w}=w\$ ,其中 $\$ 是一个比字符集里面任何数小的字符。

    1 Lyndon Words

    1.1 Definition

    Lyndon Word:一个串是一个 Lyndon Word 当且仅当 a\forall a 的后缀 bb,有 a<ba < b

    还有一个定义:对于一个 nn 的串有 nn 个循环同构,则其中严格最小的那个是一个 Lyndon Word。

    比如:ab\text{ab} 是一个 Lyndon Word,但是 ba\text{ba} 不是。

    L\mathcal L 表示 Lyndon Word 的集合。

    1.2 Chan-Fox-Lyndon Factorization

    又称 Lyndon Decomposition。

    我们定义 CFL(s)\operatorname{CFL}(s) 是一个对于 ss 串的划分,即划分成了 w1w2wk=s{w_1w_2\cdots w_k} = s,使得所有 wiw_i 是 Lyndon Word,并且 w1w2wnw_1 \ge w_2 \ge \cdots \ge w_n

    比如:串 bbababaabaaabaaaab\text{bbababaabaaabaaaab} 的 Lyndon 分解是 $\color{blue}\text{b}\color{red}\text{b}\color{blue}\text{ab}\color{red}\text{ab}\color{blue}\text{aab}\color{red}\text{aaab}\color{blue}\text{aaaab}$。

    Theory 1.2.1 Lyndon Concatanation

    这是一个很显然的结论。

    如果 a,bLa, b \in \mathcal L,且 a<ba < b,则 abL {ab} \in \mathcal L

    由于 a<ba < b,我们有 ab<b{ab} < b。接下来我们分两种情况讨论。

    1. a⋢ba \not \sqsubseteq b 时:根据 a<ba < b,我们有 aba \triangleleft b。所以 abb    ab<b{ab} \triangleleft b \implies {ab} < b

    2. aba \sqsubseteq b 时:令 b=acb={ac},则 ab=a2c{ab} = {a^2c}。因为 bLb \in \mathcal L,所以 ab<b    a2c<ac    ac<c{ab} < b \implies {a^2c} < {ac} \implies {ac} < c,所以 b<cb < c

    所以,$\forall d \in \operatorname{suf}^+(b), \ {ab} < b < d \implies \forall c \in \operatorname{suf}^+(a),\ a \triangleleft e \implies {ab} \triangleleft {eb}$。\blacksquare

    Theory 1.2.2 Existence of CFL

    这个结论和 [Theory 1.2.3] Uniqueness of CFL 是两个很有趣的结论。

    对于任意的串 ssCFL(s)\operatorname{CFL}(s) 一定存在。

    构造法。我们考虑,单个的字母一定是 Lyndon Word。

    根据 [Theory 1.2.1 Lyndon Concatanation],我们可以把字典序小的两个 Lyndon Word 并起来,所以我们把所有的字典序单增的序列都并起来,剩下的就是一个合法的 CFL。\blacksquare

    Theory 1.2.3 Uniqueness of CFL

    对于任意的串 ssCFL(s)\operatorname{CFL}(s) 一定唯一。

    反证法,假设有两种方案。我们考虑第一个不同的位置的情况,可以很容易地得到矛盾,和 CFL 的定义矛盾。\blacksquare

    然后我们就得到了 CFL 存在且唯一。由此有两个推论:

    Theory 1.2.4 Lyndon Suffixes and Lyndon Prefixes

    w1w_1 是最长的 Lyndon 前缀且 wkw_k 是最长的 Lyndon 后缀。

    反证法。因为如果 w1w_1 不是最长,那么还能再拼,产生了两个合法的 CFL,和 [Theory 1.2.3 Uniqueness of CFL] 矛盾。所以 w1w_1 是最长的 Lyndon 前缀。

    wkw_k 同理。\blacksquare

    Theory 1.2.5 Theory of Minsuf

    一个字符串 ss 的最小后缀是 wkw_k

    首先,我们有这样的一个 CFL:

    Pic1

    首先,我们记 wnw_n 的起始位置为 pospos,则显然

    这个位置是不可能的

    如图,最小后缀的其实位置不可能 >pos>pos,因为根据 Lyndon Word 的定义,wnw_n 的每个后缀都大于他自身。

    接下来我们考虑最小后缀在另一个位置的情况,即他在另一个 wiw_i 之中

    这个位置也是不行的

    根据 wiwi+1wnw_i \ge w_{i+1}\ge \cdots \ge w_n,而 wiw_i 的一个后缀 >wi> w_i,所以这个后缀大于 wnw_n

    所以唯一可能的最小后缀就是 wnw_n

    简单来说,假设最小后缀是 xwi+1wi+2wk{xw_{i+1}w_{i+2}\cdots w_{k}} 而不是 wkw_kx<wi|x| < |w_i|。我们有 xwi+1wkx>wiwk{x w_{i + 1} \dots w_k} \geq x > w_i \ge w_k,矛盾。\blacksquare

    1.3 Duval's Algorithm

    就是求出 CFL 的算法啦~

    我们有一个非常优美的算法

    有一个言简意赅、一看就懂的描述

    uavL {uav} \in \mathcal{L}u,v,hΣu,v,h \in \Sigma^*a<bΣa<b\in\Sigmak1k\ge1

    1. (uav)kubL{(uav)^k ub} \in \mathcal{L}
    2. $\operatorname{CFL}({(ubv)^k uah}) = {(ubv)^k} \operatorname{CFL}({uah})$
    3. $\operatorname{CFL}({(uv)^k u}) = {(uv)^k} \operatorname{CFL}(u)$

    换成代码实现就是:

    我们需要维护两个部分:ubvubvuu

    简单来说,就是如果可以拼到当前的串的末尾就拼上去,否则就是一个新的 Lyndon Word。(如果碰到一个比当前的小的东西,则我们更新 ubvubv,否则我们就更新 uu)。

    如果还是不太懂可以移步 oi-wiki,那里写的比较详细。

    模拟即可,显然空间复杂度 O(1)\mathcal O(1)。接下来证明一下时间复杂度。

    接下来证明一下复杂度为什么是对的。

    最优情况为一个分解走到底,O(n)\mathcal O(n)

    最坏情况为不停地在重新找,由于至多回退 nn 次,每次回退的距离不超过前进的距离,所以是 O(n)\mathcal O(n)

    2 Significant Suffixes

    这里不太用到,需要的去 ZJOI2017 字符串 题解 看吧。

    3 Lyndon Array

    3.1 Definition

    我们有一个字符串 ss,则

    Lyndon Array:$\mathcal L[i] = \max \{j : s_i \cdots s_{j-1} \in L\}$,其中 LL 表示 Lyndon 串的集合。在 l\prec_l 意义下的 L\mathcal L 记为 Ll\mathcal L_l

    这有啥子用?别急,先看性质。

    3.2 Non Intersecting Substrings

    Theory 3.2.1 Non Intersecting Lyndon Substrings

    最长的 Lyndon 子串是无交集的,即 i<j<L[i]i < j < \mathcal L[i],我们有 L[j]L[i]\mathcal L[j] \le \mathcal L[i]

    我们假设存在 i,ji,j 使得 L[i]<L[j]\mathcal L[i] < \mathcal L[j]

    我们假设 u=sisj1u = s_i \cdots s_{j-1}v=sjsL[i]1v = s_j \cdots s_{\mathcal L[i] - 1}w=sL[i]sL[j]1w = s_{\mathcal L[i]} \cdots s_{\mathcal L[j] - 1},且 u,v,wu,v,w 满足 uv,vwL{uv}, {vw} \in L

    对于所有的 ssuf+(uvw)s \in \operatorname{suf}^+({uvw}),且满足 sv+w|s| \le |v| + |w|,有 $s \triangleleft {vw} \sqsupseteq v \triangleleft {uv}$。    uvws\implies {uvw} \triangleleft s

    对于所有的 ssuf+(uvw)s \in \operatorname{suf}^+({uvw}),且满足 s>v+w|s| > |v| + |w|,有 svwsvuv{svw} \sqsupseteq {sv} \triangleleft {uv}    uvwsvw\implies {uvw} \triangleleft {svw}

    所以 uvwL{uvw} \in L,矛盾。\blacksquare

    3.3 Suffix & Lyndon Arrays

    我们设 suf(i)=sisn1\operatorname{suf}(i) = s_i \cdots s_{n-1},即一个后缀。

    而我们有 $s_i \cdots s_{\mathcal L[i] - 1} \triangleleft s_j \cdots s_{\mathcal L[i] - 1}$。

    $\implies \operatorname{suf}(i) \triangleleft \operatorname{suf}(j)\quad(i<j<\mathcal L[i])$

    于是我们设

    $$\operatorname{NSV}(i) = \min\{\{j > i : \neg(\operatorname{suf}(i) \triangleleft \operatorname{suf}(j))\} \cup \{n\}\} $$

    显然 L[i]NSV(i)\mathcal L[i] \le \operatorname {NSV}(i)

    我们还有 $\neg(\operatorname{suf}(i) \triangleleft \operatorname{suf}(j)) \Longleftrightarrow \operatorname{suf}(j) \sqsubseteq \operatorname{suf}(i) \vee \operatorname{suf}(j) \triangleleft \operatorname{suf}(i) \Longleftrightarrow \operatorname{rank}(i) > \operatorname{rank}(j)$。

    Theory 3.3.1 NSV Theory

    有了上述定义,证这个是不是非常简单呢 XD

    L[i]=NSV(i)\mathcal L[i] = \operatorname{NSV}(i)

    原命题可以很方便地转化为 sisNSV(i)1Ls_i \cdots s_{\operatorname{NSV}(i) - 1} \in L

    分类讨论:

    1. 如果 NSV(i)=n\operatorname{NSV}(i) = n,$s_i \cdots s_{\operatorname{NSV}(i) - 1} = \operatorname{suf}(i)$

    2. 否则的话我们肯定有一些 jj 使得 $\operatorname{suf}(i) \triangleleft \operatorname{suf}(j)$。

      然后我们继续来讨论:

      i) 如果 $s_1 \cdot s_{\operatorname{NSV}(i) - 1} \triangleleft s_{j} \cdots s_{\operatorname{NSV}(i) - 1}$,易证。

      ii) 反之,结合 $\operatorname{suf}(i + (\operatorname{NSV}(i) - j) - 1) \triangleright \operatorname{suf}(i)>\operatorname{suf}(\operatorname{NSV}(i))$,易证矛盾。(你看不出来?明显与 $\operatorname{suf}(i) \triangleright \operatorname{suf}(j)$ 矛盾)。\blacksquare

    4 Runs

    4.1 Definition

    这个东西的英文名是 runs,他的中文名是顶天立地串……(好中二啊)

    我们有一个串,runs 是他的一些子串,满足:

    $p = \operatorname{per}(s_i\cdots s_{j-1})\le \dfrac {j-i}2$,si1si1+ps_{i-1} \ne s_{i-1}+psjp=sjs_{j-p}=s_{j}

    更好理解的定义:

    定义一个字符串 S|S| 里的一个 run,指其内部一段两侧都不能扩展的周期子串,且周期至少完整出现两次。

    严格地说,一个 run 是一个 三元组 (i,j,p)(i,j,p),满足 ppS[i..j]S[i..j] 的最小周期,ji+12pj-i+1 \ge 2p,且满足如下两个条件:

    • 要么 i=1i=1,要么 S[i1]S[i1+p]S[i-1]\ne S[i-1+p]
    • 要么 j=nj=n,要么 S[j+1]S[j+1p]S[j+1] \ne S[j+1-p]

    例如:S=aababaababbS = \text{aababaababb} 之中有 7 个 runs:S[1..2]=a2S[1..2] = \text a^2S[1..10]=(aabab)2S[1..10] = (\text{aabab})^2S[2..6]=(ab)2.5S[2..6] = (\text{ab})^{2.5}S[4..9]=(aba)2S[4..9] = (\text{aba})^2S[6..7]=a2S[6..7] = \text a^2S[7..10]=(ab)2S[7..10] = (\text{ab})^2S[10..11]=b2S[10..11] = \text b^2

    (实际上是 LOJ #173 的题面,题目是我造的,这一段是 EtoainWu 的文字)

    定义 Runs(w)Runs(w) 表示字符串 ww 的所有 runs 的集合。

    ρ(n)\rho(n) 表示了在一个长为 nn 的字符串之中至多有多少组 runs,而 σ(n)\sigma(n) 表示了在一个长为 nn 的字符串之中所有 runs 的幂之和的最大值。

    Lyndon Root:令 r=(i,j,p)r=(i,j,p) 是一个run,则他的 Lyndon Root 是一个 s[i..j]s[i..j] 的长度为 pp 的 Lyndon 子串。

    每一个 run 都有一个 Lyndon root。

    4.2 Linear Runs

    Theory 4.2.1 Linear Runs Theory

    我们假设 0\prec^0 表示 <<,而 1\prec^1 表示 <R<^R。(此处的 R^R 表示 reverse,给 \prec 标号是为了方便)

    0\prec^01\prec^1 的对应的 Lyndon Array 是 L0\mathcal L^0L1\mathcal L^1.

    ρ(n)2n\rho(n) \le 2n

    原命题可以转化为

    对于每个 runs,我们有存在 iitt 使得 s[i..Lt[i]1]s[i..\mathcal L^t[i] - 1] 是 Lyndon root。

    我们令 ww 是 Lyndon root,w=s[k..s1]w=s[k..s-1]

    分类讨论:

    1. 如果 j=Sj=|S|

      我们可以把 s[k..S1]s[k .. |S| - 1] 表示成 wpw (pN,wpref(w)){w^pw'} \ (p \in N, w' \in \operatorname{pref}(w))

      因为 $\operatorname{CFL}({w^pw'}) = {w^p\operatorname{CFL}(w')}$,所以 ww 是从 kk 开始的最长 Lyndon 前缀。

    2. 如果 j<Sj<|S|

      我们可以把 ww 表示成 uab{uab},其中 aba \ne b

      所以我们可以把 sksS1s_k \cdots s_{|S| - 1} 表示成为 (uav)pub{(uav)^pub}

      我们不妨假设 btab \prec^t a

      因为我们有 $\operatorname{CFL}^t({(uav)^pubh}) = (uav)^p\operatorname{CFL}^t({ubh})$,所以 uav{uav}t\prec^t 下的最长 Lyndon 前缀。\blacksquare

    Theory 4.2.2 The "Runs" Theory

    ρ(n)<n,σ(n)3n3\rho(n)<n,\sigma(n)\leq3n-3

    几乎从 WC2019 课件搬运的证明

    定义 Beg(I)Beg(I) 表示 II 中所有区间的起始端点的集合。

    Lemma A

    对于一个串的 Lyndon Array L0[i]\mathcal L^0[i]L1[i]\mathcal L^1[i],总有 $\mathcal L^{l}[i] = [i..i], \mathcal L^{1-l}[i] = [i..j] (j\ne i)$,其中 l{0,1}l\in \{0,1\}

    k=max{k w^kw^i,k>i}k=\max\{k'\ |\hat{w}_{k'}\ne \hat{w}_i,k'>i\}

    [Theory 1.2.1 Lyndon Concatanation] 可得:

    • w^k<w^i\hat w_k < \hat w_i,则 L0[i]=[i..i]\mathcal L^0[i]=[i..i],且 L1[i]=[i..j] (jk>i)\mathcal L^1[i]=[i..j]\ (j\geq k>i)
    • w^k>w^i\hat w_k > \hat w_i,则 L1[i]=[i..i]\mathcal L^1[i]=[i..i],且 L0[i]=[i..j] (jk>i)\mathcal L^0[i]=[i..j]\ (j\geq k>i)\blacksquare
    Lemma B

    r=(i,j,p)r=(i,j,p) 为一个run,则对于 w^[j+1]lw^[j+1p]\hat{w}[j+1]\prec_l \hat{w}[j+1-p]llr\forall rl\prec_l 意义下的 Lyndon Root w^[iλ..jλ]\hat w[i_{\lambda}..j_{\lambda}] 都与 Ll(iλ)\mathcal L^l(i_{\lambda})相等。

    w^[j+1]w^[j+1p]\because \hat{w}[j+1]\ne\hat{w}[j+1-p],令 l{0,1}l\in\{0,1\} 满足 w^[j+1]lw^[j+1p]\hat{w}[j+1]\prec_l\hat{w}[j+1-p]

    λ=[iλ...jλ]\lambda=[i_{\lambda}...j_{\lambda}]rrl\prec_l 意义下的一个 Lyndon Root,由 [Theory 1.2.1 Lyndon Concatanation],$[i_{\lambda}...j_{\lambda}]=\mathcal L^l(i_{\lambda})$。\blacksquare

    对于一个run r=(i,j,p)r=(i,j,p),令 Br={λ=[iλ...jλ]λB_r=\{\lambda=[i_{\lambda}...j_{\lambda}]|\lambdarrl\prec_l 意义下的一个 Lyndon Root 且 iλi}i_{\lambda}\ne i\}。即 BrB_r 表示所有 rr 的关于 l\prec_l 的 Lyndon Root 构成的集合,但要除去开头位置 ii 处开始的 Lyndon Root。有 Beg(Br)=Brer11|Beg(B_r)|=|B_r|\geq \lfloor e_r-1\rfloor\geq 1,其中 ere_rrr 的指数。

    Lemma C

    两个不同的 run r,rr,r'Beg(Br)Beg(Br)Beg(B_r)\cap Beg(B_{r'}) 为空。

    反证,假设存在 iBeg(Br)Beg(Br)i\in Beg(B_r)\cap Beg(B_{r'}),并且 λ=[i...jλ]Br\lambda=[i...j_{\lambda}]\in B_rλ=[i...jλ]Br\lambda'=[i...j_{\lambda'}]\in B_{r'}

    l{0,1}l\in\{0,1\} 满足 λ=Ll[i]\lambda=\mathcal L^l[i],由于 λλ\lambda\ne \lambda',有 λ=L1l[i]\lambda'=\mathcal L^{1-l}[i]

    Lemma Aλ\lambdaλ\lambda' 中有且只有一个为 [i..i][i..i]

    不妨设 λ=[i..i]\lambda=[i..i],那么 jλ>ij_{\lambda'}>i

    由于 w[i...jλ]w[i...j_{\lambda'}] 为一个 Lyndon Word,有 w[i]w[jλ]w[i]\ne w[j_{\lambda'}]

    BrB_rBrB_{r'} 的定义,rrrr' 的开始位置均小于 ii,这意味着 w[i1]=w[i]w[i-1]=w[i](由 rr 的周期性),并且 w[i1]=w[jλ]w[i-1]=w[j_{\lambda'}](由 rr' 的周期性)。矛盾 \blacksquare

    任意的一个 run rr 可以被赋予一个两两不交的非空位置集合 Beg(Br)Beg(B_r)。并且,由于 1Beg(Br)1\notin Beg(B_r) 对于任意的一个 rr 均成立,有 $\sum_{r\in Runs(w)}|B_r|=\sum_{r\in Runs(w)}|Beg(B_r)|\leq |w|-1$。

    考虑字符串 ww,由于对于任意 rRuns(w)r\in Runs(w),有 Br1|B_r|\geq1,由 Lemma C,有 Runs(w)rRuns(w)Brw1|Runs(w)|\leq\sum_{r\in Runs(w)}|B_r|\leq |w|-1

    考虑字符串 ww,令 ere_r 表示 rr 的指数。由于对于任意 rRuns(w)r\in Runs(w),有 Brer1>er2|B_r|\geq \lfloor e_r-1\rfloor>e_r-2,由 Lemma C,有 $\sum_{r\in Runs(w)}(e_r-2)<\sum_{r\in Runs(w)}\lfloor e_r-1\rfloor\leq\sum_{r\in Runs(w)}|B_r|\leq |w|-1$。因为 Runs(w)w1|Runs(w)|\leq |w|-1,可得 rRuns(w)er3n3\sum_{r\in Runs(w)}e_r\leq3n-3\blacksquare

    4.3 Details about Implementation

    现在,问题来了:我们怎么算 L0\mathcal L^0L1\mathcal L^1

    简要思路:

    $$\mathcal{L}^0[i] = \mathrm{NSV}(i) = \min\{\{j > i : \neg(\mathrm{suf}(i) \triangleleft \mathrm{suf}(j))\} \cup \{n\}\} $$

    类似的,

    $$\begin{aligned}\mathcal{L}^1[i] &= \mathrm{NSV}^R(i) \\&= \min\{\{j > i : \neg(\mathrm{suf}(i) \triangleleft^R \mathrm{suf}(j))\} \cup \{n\}\} \\&= \min\{\{j > i : \mathrm{suf}(i) \triangleleft \mathrm{suf}(j) \vee \mathrm{suf}(i) \sqsupseteq \mathrm{suf}(j))\} \cup \{n\}\}\end{aligned} $$

    在实现 Runs 之前,你需要会字符串哈希或者后缀数组或者其他后缀数据结构。

    根据以上证明中的 Lemma B,每一个 runs 都会对应一个 Lyndon root,所以如果我们把 Lyndon Array 算出来了,就可以把每个 runs 对应的 Lyndon root 求出来。

    所以我们考虑对于字符串的每个后缀都维护他的 CFL,方法是在头上插入一个新字符,然后判断是否合法。根据 [Theory 1.2.1 Lyndon Concatanation],如果遇到一个 Lyndon word 大于下一个的情况,合并即可。可以保证正确性。

    这里有一个实现上的细节,可能会好写一点。根据 [Theory 1.2.4 Lyndon Suffixes and Lyndon Prefixes]wiw_iwiwi+1wkw_iw_{i+1}\cdots w_k 的最小前缀,所以比较两个 Lyndon word 的字典序相当于比较两个后缀的大小,而这个是比做一个 lcp 要简单多的。

    所以至此 Lyndon Array 已经求完了,具体实现细节可以看代码。

    接下来我们只要使用 Lyndon Array 扩展出 runs 就可以了,具体的做法是求出 lcp,即如果当前的 Lyndon Array L[i]=(l..r)\mathcal L[i] = (l..r),则我们 lcp 求出最长的 $s[l..l+l_1-1]=s[r+1..r+l_1], s[l-l_2..l-1]=s[r-l_2..r-1]$。

    根据 runs 的定义,如果 l1+l22(lr+1)l_1 + l_2 \ge 2(l - r + 1),那么我们就找到了一个 run (ll2,r+l11,rl+1)(l-l_2, r+l_1-1, r-l+1)

    如果我们使用 SAIS 和 O(n)O(1)\mathcal O(n) - \mathcal O(1) 的 rmq 算法,我们就可以线性时间内求出所有的 runs。

    比较优秀的 O(n)O(1)\mathcal O(n) - \mathcal O(1) 的 rmq 方法:叉姐的hqztrue的

    Template

    Luogu P6656

    是我出的啦owo

    求就好了,真真实实的板子题。

    Code

    这篇文章可能以后还会更,加上 2-Period 问题什么的。

    5 Three Squares Lemma

    5.1 Definition

    Squares: 能表示成 x2x^2 的串。

    Primitive Squares: 不能再拆的 Squares。如 x2+xx^2+x 一定是一个 Primitive Square。

    5.2 Three Squares Lemma

    Theory 5.2.1 Three Squares Lemma

    我们有 3 个 Primitive Squares,为 u2u^2v2v^2w2w^2,满足 u<v<w|u|<|v|<|w|

    则我们有 u+vw|u| + |v| \le |w|,并且 Primitive Squares 是数量是 poly log 级别的,即 O(nlogn)\mathcal O(n\log n)

    唔,我不会证= =咕了咕了

    Evguenia Kopylova, W.F. Smyth. The three squares lemma revisited. DOI: 10.1016/j.jda.2011.03.009

    6 扯淡

    我在出 LOJ #173 的时候,发现有一个非常强的暴力,就是暴力地去做 lcp 和 lcs。

    后来我经过不懈努力使用 aaaaa...ab 这个串卡掉了他,但是其实考场上如果时间不够的话写这个暴力其实是非常优秀的,毕竟我见过的两个 runs 题都没有卡这个暴力

    • 1

    信息

    ID
    5695
    时间
    2000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    0
    已通过
    0
    上传者