Lyndon Word

定义

对于字符串 \(S\),若 \(S\) 的最小后缀为其本身,那么称 \(S\) 为 \(\text{Lyndon}\) 串(\(\text{Lyndon Word}\))

\[S \in L \Rightarrow \begin{cases} S是严格最小循环 \\ minsuf(s)=s \end{cases}
\]

性质

\(Border(S)=\varnothing\)

推论

如果 \(u,v \in L, u \prec v\Rightarrow uv \in L\)。

\(\mathcal{Proof.}\)

\(1) s=u'v,u\triangleleft u' \Rightarrow uv < u'v\)

\(2) \text{to prove uv<v}\)

​ \(2.1) u \triangleleft v \Rightarrow uv<v\)

​ \(2.2) u \sqsubseteq v \Rightarrow v=uv',v<v' \Leftrightarrow uv<uv' \Leftrightarrow uv<v\)

\(3) S=v',uv<v<v'\)

\(Q.E.D.\)

PS: \(\triangleleft\):严格小于,且不是前缀,必有一个字母不同,\(\sqsubseteq\):前缀

\(ex.\) 如果 \(u,v\in L,u<v \Rightarrow u^av^b\in L\)

显然。

Lyndon 分解 (Lyndon Factorization)

任意字符串 \(s\) 可以分解为 \(s=s_1s_2s_3\dots s_k\),其中 \(s_i\) 是 \(\text{Lyndon}\) 串,\(s_i \ge s_{i+1}\),且这种分解方法是唯一的。

\(\mathcal{Proof.}\)

先证存在性

初始时每段一个字符,然后不断地将相邻两段 \(s_i<s_{i+1}\) 合并。

再证唯一性

若有两种方案,取第一次不同的位置,设 \(|s_i| > |s_i'|\),令 \(s_i=s_i's_{i+1}' \dots s_k'pre(s_{k+1}',l)\),则

\[s_i<pre(s_{k+1}',l)\le s_{k+1}' \le s_i' < s_i,矛盾
\]

性质

  1. \(s_k\) 是最长的 \(\text{Lyndon suffix}\)
  2. \(s_1\) 是最长的 \(\text{Lyndon prefix}\)
  3. \(s_k=minsuf(s)\)

\(\mathcal{Proof.}\)

画图比划一下,容易(是真的)证得。

Duval 算法

\(\text{Duval}\) 算法可以 \(O(n)\) 时间 \(O(1)\) 额外空间内求出 \(s[1\dots n]\) 的 \(\text{Lyndon}\) 分解。

\[CFL(s)=s_1 s_2 \dots s_k, s.t. \begin{cases} 1. s_i \in L \\ 2. s_1 \ge s_2 \ge \dots \ge s_k\end{cases}
\]

\(\mathcal{Lemma.}\)

若字符串 \(v\) 和字符 \(c\) 满足 \(vc\) 是某个 \(\text{Lyndon}\) 串的前缀,则对于字符 \(d>c\) 有 \(vd\) 是\(\text{Lyndon}\) 串。

也就是说,如果 \(uav \in L\),那么对于 \((uav)^kua'\):

  1. 如果 \(a<a'\),那么 \((uav)^kua' \in L\)

  2. 如果 \(a>a'\),那么 \(\forall w,(uav)^kua'w \notin L\)

    \(\Rightarrow CFL[(uav)^kua'w]=(uav)^kCFL(ua'w)\)

因此,我们考虑下面这个算法过程:

用三个循环变量 \(i,j,k\) 维持一个循环不变式:

  • \(s[1 \dots i-1] = s_1 s_2 \cdots s_g\) 是已经固定下来的分解,满足 \(s_l\) 是 \(\text{Lyndon}\) 串,且 \(s_l \le s_{l+1}\)。
  • \(j-i\) 是当前最长的 \(\text{Lyndon prefix}\) 的长度,即 \(s[j]\) 是 \(s[k]\) 在 \(\text{Lyndon Prefix}\) 中对应位置的字符。
  • \(k\) 是当前读入的字符的位置。

然后对于当前读入的字符 \(a\)

  • 若 \(a>s[j]\),则令直接令 \(s[i\dots k]\) 成为新的 \(\text{Lyndon Prefix}\)
  • 若 \(a=s[j]\),无法切割出新的划分,继续读入
  • 若 \(a<s[j]\),则递归求解,先分解完 \(s[i\dots t]\) ,即 \((uav)^k\),然后将指针指向 \(t+1\) 重新进行算法过程。

Code

int i, j, k;
for (i = 1; i <= N; ) {
for (k = i, j = k + 1; j <= N && s[j] >= s[k]; ++j) {
if (s[j] > s[k]) k = i;
else ++k;
}
while (i <= k) { lyndon[++cnt] = i + j - k - 1; i += j - k; }
}

"Runs" Theorem

先丢一个论文链接:The" Runs" Theorem

Lyndon Array

再说。

[ZJOI2017] 字符串

Description

维护一个动态字符串 \(s[1\dots n]\),字符串的字符集是所有 \(|x|\le 10^9\) 的整数。要求支持两个操作:

  1. 输入 \(l,r,d\),对于所有 \(l\le i \le r\),将 \(s[i]\) 修改为 \(s[i]+d\),注意 \(d\) 可能是负数
  2. 输入 \(l,r\),输出子串 s\([l\dots r]\) 的字典序最小的后缀的起点位置。即,如果最小后缀是 \(s[p\dots r],(l\le p\le r)\),请输出 \(p\)。

Solution

Lyndon Word相关的更多相关文章

  1. Lyndon Word学习笔记

    Lyndon Word 定义:对于字符串\(s\),若\(s\)的最小后缀为其本身,那么称\(s\)为Lyndon串 等价性:\(s\)为Lyndon串等价于\(s\)本身是其循环移位中最小的一个 性 ...

  2. Lyndon 相关的炫酷字符串科技

    浅谈从 Lyndon Words 到 Three Squares Lemma By zghtyarecrenj 本文包括:Lyndon Words & Significant Suffixes ...

  3. C# 将excel表格嵌入到Word中

    C# 将excel表格嵌入到Word中 继续开扒,今天要实现的是使用C#将excel表格嵌入到Word中这个功能,将word表格导入到excel中我已经写过了,如有需要可参考我之前的文章,在开始前还有 ...

  4. 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Application”。

    无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Wor ...

  5. Android中使用POI加载与显示word文档

    最近打算实现一个功能:在Android中加载显示Word文档,当然这里不是使用外部程序打开.查看一些资料后,打算采用poi实现,确定了以下实现思路: 将ftp中的word文档下载到本地. 调用poi将 ...

  6. .NET通过调用Office组件导出Word文档

    .NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...

  7. asp.net操作word的表格

    近日开发中用户要求实现导出数据为Word,本来想使用html保存为word的实现,但因用户要求样式很高,使用html不好控制,并且导出中包括图片,使用页面导出时图片还是一个路径,不能把图片包括在wor ...

  8. .net下将富文本编辑器文本原样读入word文档

    关键词:富文本编辑器  生成word  样式 为了解决标题中提出的问题,首选需要了解,在.net环境下读取数据库中的内容动态生成word至少有2种方式,[方式一]一种方式是在项目中添加引用,例如在“添 ...

  9. VC+++ 操作word

    最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008 导入接口 首先在创建的MFC项目中引入word相关组件 右键点击 项目 ...

随机推荐

  1. 557反转字符串中的单词III

    class Solution: # 定义一个反转字符串的函数. def str_rever(self,s): length = len(s) s1 = '' for index in range(le ...

  2. 白嫖码云Pages,两分钟的事,就能搭个百度能搜到的个人博客平台

    为了攒点钱让女儿做个富二代(笑),我就没掏钱买服务器,白嫖 GitHub Pages 搭了一个博客平台.不过遗憾的是,GitHub Pages 只能被谷歌收录,无法被百度收录,这就白白损失了一大波流量 ...

  3. uni-app 修改富文本信息中的图片样式

    var richtext= res.data.data.richtext; const regex = new RegExp('<img', 'gi'); richtext= richtext. ...

  4. openshift 4.3中安装helm3并通过helm方式部署应用

    openshift 4.3中安装helm3并通过helm方式部署应用 简介 Helm是一个命令行界面(CLI)工具,可简化将应用程序和服务部署到OpenShift Container Platform ...

  5. C005:计算多项式的值

    程序: #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { float x; do{ printf("E ...

  6. 用于测试 JsonAnalyzer2 1.01版的测试用例

    14. 原文={"animal":"ca,t","color":"ora:nge","isMale" ...

  7. leetcode刷题-52N皇后2

    题目 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击.给定一个整数 n,返回 n 皇后不同的解决方案的数量. 思路 与51题完全一致 实现 class ...

  8. SMBMS

    SMBMS(Supermarket Billing Management System ) 目录 SMBMS(Supermarket Billing Management System ) 1. 项目 ...

  9. [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点

    题解 nodeA走一个链表A(A独有+公共),再走B独有的长度, nodeB走一个链表B(B独有+公共),再走A独有的长度. 结果:两者相遇点即为交点:若没有交点,两者都走到null,会返回null. ...

  10. Python3使用钉钉机器人推送消息(签名方式)

    import time import hmac import hashlib import base64 import urllib import json import requests impor ...