Lyndon Word相关
Lyndon Word
定义
对于字符串 \(S\),若 \(S\) 的最小后缀为其本身,那么称 \(S\) 为 \(\text{Lyndon}\) 串(\(\text{Lyndon Word}\))
即
\]
性质
\(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,矛盾
\]
性质
- \(s_k\) 是最长的 \(\text{Lyndon suffix}\)
- \(s_1\) 是最长的 \(\text{Lyndon prefix}\)
- \(s_k=minsuf(s)\)
\(\mathcal{Proof.}\)
画图比划一下,容易(是真的)证得。
Duval 算法
\(\text{Duval}\) 算法可以 \(O(n)\) 时间 \(O(1)\) 额外空间内求出 \(s[1\dots n]\) 的 \(\text{Lyndon}\) 分解。
即
\]
\(\mathcal{Lemma.}\)
若字符串 \(v\) 和字符 \(c\) 满足 \(vc\) 是某个 \(\text{Lyndon}\) 串的前缀,则对于字符 \(d>c\) 有 \(vd\) 是\(\text{Lyndon}\) 串。
也就是说,如果 \(uav \in L\),那么对于 \((uav)^kua'\):
如果 \(a<a'\),那么 \((uav)^kua' \in L\)
如果 \(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\) 的整数。要求支持两个操作:
- 输入 \(l,r,d\),对于所有 \(l\le i \le r\),将 \(s[i]\) 修改为 \(s[i]+d\),注意 \(d\) 可能是负数。
- 输入 \(l,r\),输出子串 s\([l\dots r]\) 的字典序最小的后缀的起点位置。即,如果最小后缀是 \(s[p\dots r],(l\le p\le r)\),请输出 \(p\)。
Solution
Lyndon Word相关的更多相关文章
- Lyndon Word学习笔记
Lyndon Word 定义:对于字符串\(s\),若\(s\)的最小后缀为其本身,那么称\(s\)为Lyndon串 等价性:\(s\)为Lyndon串等价于\(s\)本身是其循环移位中最小的一个 性 ...
- Lyndon 相关的炫酷字符串科技
浅谈从 Lyndon Words 到 Three Squares Lemma By zghtyarecrenj 本文包括:Lyndon Words & Significant Suffixes ...
- C# 将excel表格嵌入到Word中
C# 将excel表格嵌入到Word中 继续开扒,今天要实现的是使用C#将excel表格嵌入到Word中这个功能,将word表格导入到excel中我已经写过了,如有需要可参考我之前的文章,在开始前还有 ...
- 无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Word._Application”。
无法将类型为“Microsoft.Office.Interop.Word.ApplicationClass”的 COM 对象强制转换为接口类型“Microsoft.Office.Interop.Wor ...
- Android中使用POI加载与显示word文档
最近打算实现一个功能:在Android中加载显示Word文档,当然这里不是使用外部程序打开.查看一些资料后,打算采用poi实现,确定了以下实现思路: 将ftp中的word文档下载到本地. 调用poi将 ...
- .NET通过调用Office组件导出Word文档
.NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...
- asp.net操作word的表格
近日开发中用户要求实现导出数据为Word,本来想使用html保存为word的实现,但因用户要求样式很高,使用html不好控制,并且导出中包括图片,使用页面导出时图片还是一个路径,不能把图片包括在wor ...
- .net下将富文本编辑器文本原样读入word文档
关键词:富文本编辑器 生成word 样式 为了解决标题中提出的问题,首选需要了解,在.net环境下读取数据库中的内容动态生成word至少有2种方式,[方式一]一种方式是在项目中添加引用,例如在“添 ...
- VC+++ 操作word
最近完成了一个使用VC++ 操作word生成扫描报告的功能,在这里将过程记录下来,开发环境为visual studio 2008 导入接口 首先在创建的MFC项目中引入word相关组件 右键点击 项目 ...
随机推荐
- 揭秘|一探腾讯基于Kubeflow建立的多租户训练平台背后的技术架构
腾讯业务及组织架构现状 先简单和大家介绍一下腾讯内部的业务及相关组织架构的现状,有助于帮助大家理解为什么我们会基于后面的架构来设计整套方案. 下图的应用大多数人经常会用到,比如微信.腾讯视频.游戏等等 ...
- Unity游戏资源反解工具
https://github.com/ata4/disunity http://devxdevelopment.com/UnityUnpacker 链接:https://pan.baidu.com/s ...
- 避免nullpointer 空指针
来自知乎: 一般在服务器返回的数据上我们会做数据合法性检测,所以在api文档上需要注明字段的取值范围,然后客户端根据这个去做数据检测,缺段就直接走数据错误的流程,这个很大程度上避免了不少nullpoi ...
- Photogrammetry and Game
https://skulltheatre.wordpress.com/2013/02/11/photogrammetry-in-video-games-frequently-asked-questio ...
- Web测试经典bug、安全性测试
典型BUG 表格的排序.翻页.添加.删除的联合测试 输入框的长度检查 数据库表中如果指定utf8长度为150,则可以输入150个中文或英文字母等 (有时候界面判断失误,却只能输入50个汉字) 数据添加 ...
- 最短路径(dijkstra 与 Floyd)
目录 1. 如何建图? 2. Floyd 3. Dijkstra 1. 如何建图? 要跑最短路,首先要有图 --鲁迅 常用的存储方法有两种,分别是邻接矩阵(用二维数组表示边)和邻接表(模拟链表表示边) ...
- 转载:MYSQL数据库三表联查的SQL优化过程
地址:https://database.51cto.com/art/202002/609803.htm 作者用了三张有设计缺陷的表做例子,使得优化效果空前,优化手段仅为拨乱反正和加索引,此行可为一哂.
- pwnable.kr之fd
题目如图: 在终端输入:ssh fd@pwnable.kr -p2222 连接到远程终端,如图: 输入ls -l,查看文件: 输入whoami,查看自身用户名称: 根据题目意思我们只要打开flag文件 ...
- SpringMVC-08-整合SSM之CRUD
查询书籍功能 完善Controller:BookController @Controller @RequestMapping("/book") public class BookC ...
- pytest文档3-pytest+Allure+jenkins+邮箱发送
前言: 虽然网上有很多邮件配置的文章,但还是想自己写一下配置的过程,因为在中间也碰到了不同坑.按照这个文档配置的话,99%都可以成功. 一.jenkins 配置邮箱 1.打开jenkins后进入点 ...