首页 > 其他分享 >Lyndon 串

Lyndon 串

时间:2024-11-04 20:58:04浏览次数:2  
标签:复杂度 cdots Lyndon ge 分解 字符串

你说得对,但是这个是\(\Large{\textsf{巨大}}\)浓缩版。非浓缩版作者并没有写完。作者删掉了所有的证明,居心不良。

定义:\(S\) 是 Lyndon 串(Lyndon word)当且仅当 \(S\) 是所有后缀中最小的。也当前仅当 \(S\) 比所有他的其他 cyclic-shift 都小。

性质:Lyndon 串 无非空的 border。证明:假设有非空 border,则 \(S=aba\),则 \(aab\) 一定更小。

引理 1:\(u,v\) 是 LW,若 \(u<v\),则 \(uv\) 也是 Lyndon 串。

定义一个串分解成 Lyndon 串的标准形式为标准分解

标准分解:将 \(S\) 划分成若干个 Lyndon 串 \(w_1\sim w_k\),使得 \(w_1\ge w_2\ge \cdots \ge w_k\)。

性质:一个字符串得 Lyndon 分解存在。

性质:一个字符串得 Lyndon 分解唯一。

Duval 算法

引理 2:\(c<c'\),\(vc\) 是某个 LW 的前缀,$vc'\in $ LW。

维护三个指针:\(i,j,k\),其中 \(S[1,i-1]\) 已经分解完毕,\(S[i,k-1]\) 是形如 \(w^xw'\) 的串(\(w'\) 是 \(w\) 的可空真前缀,\(w\) 是 LW),\(j\) 是 \(k-|w|\)。\(k\) 是下一个我们要加入的字符。\(i\sim k-1\) 中有一个长度为 \(|u|=k-j\) 的周期。

一共有三种情况:

  • \(S_j=S_k\)。那么我们的周期可以保持不变,\(j\gets j+1,k\gets k+1\)。
  • \(S_j<S_k\)。由引理 2 可知 \(w^xw'S_k\) 是一个 LW,因此合并他们为 \(w\)。
  • \(S_j>S_k\)。这样 \(w^x\) 已经确定下来了,分解中多出 \(x\) 个 \(w\),然后重新回到 \(w'\) 的开头分解。
while (i<n){
    int j=i,k=i+1;
    while (k<n && s[j]<=s[k]){
        if (s[j]<s[k]){
            j=i;
        }
        else{
            j++;
        }
        k++;
    }
    while (i<=j){
        ans^=i+k-j;
        i+=k-j;
    }
}

正确性:分解后 \(w_1\ge w_2\ge \cdots \ge w_k\)。证明:我们每一次跳出内层第一个 while 循环一定是出现了 \(S_j>S_k\),这个时候 \(w^xw'\) 里面的 \(w\) 一定是大于 \(w'+S_k\) 的,则 \(w>w'+S_k+t\),\(t\) 是任意字符串。也就是说最开始就保证了上一个(外层)循环内的 \(w\) 大于这一个的。

复杂度:观察程序,\(i\) 是单调向右移动的,而 \(k\) 每一次移动的距离不会超过 \(i\) 的距离,因此时间复杂度是 \(\mathcal{O}(n)\) 的。

应用:最小表示法

如何计算一个串 \(S\) 的最小表示?\(SS\) 的分解中,从开头 \(\le n\),结尾 \(>n\) 的分解开始是最优的。

标签:复杂度,cdots,Lyndon,ge,分解,字符串
From: https://www.cnblogs.com/SFlyer/p/18526280

相关文章

  • Lyndon 理论学习笔记
    字符串,太深刻了/kk定义下标从1开始。\(+\)是字符串拼接。\(|s|\)表示\(s\)的长度。\(s_i\)表示\(s\)的第\(i\)个字符。\(s^k\)表示\(k\)个\(s\)拼接的结果。字符串间的大小关系用字典序比较。Lyndon串字符串\(s\)是Lyndon串当且仅当\(s\)小于其......
  • Lyndon Word 小记
    1.定义一个字符串\(S\)被定义为LyndonWord当且仅当其严格小于所有真cyclicshift。LyndonWord的等价定义:是其所有后缀中最小的。2.性质性质1:LyndonWord无\(\text{Border}\)。不妨设\(w\)有\(\text{Border}\),则我们可以表示为\(w=xu=uy\),从而得到\(w......
  • Lyndon 分解 & runs
    万成章在2022年集训队论文《浅谈与Lyndon理论有关的字符串组合问题》中做过详细介绍,由于笔者太菜,这里只做简单介绍,并且不做证明。Lyndon分解Lyndon串:对于字符串\(s\),如果\(s\)的字典序严格小于\(s\)的所有后缀的字典序,我们称\(s\)是Lyndon串。Lyndon分解:串\(s\)的Lyndon分解记......
  • Lyndon 串相关知识速记
    LyndonWords一个串为Lyndon串当且仅当其为其所有后缀中字典序最小的.Lyndon分解:将一个串\(w\)分解为若干个字典序单调不增的Lyndon串\(w_1,w_2,\cdots,w_k\)的拼接,每个\(w_i\)为\(w\)的Lyndon因子.可以证明一个串的Lyndon分解是存在且唯一的.引理1:若\(......
  • Lyndon 分解小记
    来个简单的。概念Lyndon串:一个字符串\(s\)被称为Lyndon串,当且仅当\(s\)整个串是所有后缀中严格最小的。例如\(\mathtt{ababb},\\mathtt{abcdefg}\)。Lyndon分解:将字符串\(s\)分解为\(w_1,w_2,...,w_k\),满足\(w_1\gew_2\ge...\gew_k\),并且\(w_1,w_2,........
  • Lyndon 分解
    作用把一个大字符串分成好多个小字符串这些小字符串的最小后缀,就是其本身求出这些小字符串的右端点下标#include<bits/stdc++.h>usingnamespacestd;chars[5000005];intn,ans;vector<int>a;intmain(){ scanf("%s",s+1); n=(int)strlen(s+1); intx; for(inti=......
  • Lyndon 分解
    Lyndon串:\(s<{\rmsuf}'(s)\)的串\(s\)为Lyndon串。引理1:若\(u\)、\(v\)为Lyndon串,\(u<v\),则\(uv\)也为Lyndon串。引理2:若\(uc\)为Lyndon串的前缀,则\(uc'(c'>c)\)为Lyndon串。证明:TODO...求\(s\)的Lyndon分解,考虑增量构造。维护\(t......
  • Lyndon 分解
    现在只会lyndon分解怎么写。所以先放在这里占坑。以后补Runs和LyndonTree相关知识。大量抄pdf和cmd博客。LyndonWord及其相关性质定义:若字符串\(s\)的最小后缀是它本身,则它是一个LyndonWord。LyndonWord没有Border。证明:如果存在,则border作为后缀比......
  • Lyndon 小记
    神秘科技。定义一个串为Lyndon串,当且仅当这个串的最小表示法是它本身。定义一个串的拆分为Lyndon分解,当且仅当每个拆分都是Lyndon串,且\(s_i\geqs_{i+1}\)。求出某个串的Lyndon分解可以用Duval算法,该算法可以\(O(n)\)求出这个串的Lyndon分解。这个算法的流程如......
  • Lyndon Word 与 Lydon 分解
    \(\newcommand\m\mathbf\)\(\newcommand\t\texttt\)\(\text{ByDaiRuiChen007}\)约定:对于两个字符串\(S,T\),用\(ST\)表示将\(T\)接在\(S\)后面得到的字符串(即......