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相关组件 右键点击 项目 ...
随机推荐
- solrcloud集群版的搭建
说在前面的话 之前我们了解到了solr的搭建,我们的solr是搭建在tomcat上面的,由于tomcat并不能过多的承受访问的压力,因此就带来了solrcloud的时代.也就是solr集群. 本次配置 ...
- 使用rabbitmq过程中遇到的问题及解决方法记录。
OS: Linux ---Centos7RabbitMQ版本:RabbitMQ version: 3.8.1erlang版本:Erlang configuration: Erlang/OTP 22 [ ...
- js扩展运算符(spread)三个点(...)
常见用法: 1.该运算符主要用于函数调用. function push(array, ...items) { array.push(...items); } function add(x, y) { ...
- 绝世好题(线性dp)
给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数n. 第二行包括n个 ...
- python-opencv 图像捕捉多个不规则轮廓,与轮廓内接区域(圆/矩形)思路-持续更新编辑中(会附上详细的思路解释和图片)
整体思路: 1.原图灰度化 2.灰度图截取mask区域 3.mask区域二值化 4.二值化图像运算(开运算) 5.原灰图轮廓提取 6.不规则轮廓校准(外接矩形/内接矩形) 注:代码依次头尾连接哦! 0 ...
- WinForm使用Setuo Project打包安装包 (附带vs2019 InstallerProjects安装程序)
vs2019 InstallerProjects安装程序地址: 链接:https://pan.baidu.com/s/1K5iDuQT4CBBw2dJjRLqhjg提取码:dfhy 转载至https: ...
- jmeter连接redis取数据
1.导入fastjson-1.2.2.jar.jedis-2.2.1.jar到 jmeter\lib\ext\ 下 2.新建BeanShell Sampler import com.alibaba.f ...
- css的引用关系
总结:离div标签越近,越先被引用 先在同级目录下新建一个stylesheet(是以.css结尾的)注意:link引入进来的css中,class标签也是c1,因为html中div class=c1,因 ...
- 吴恩达《深度学习》-第五门课 序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks) -课程笔记
第一周 循环序列模型(Recurrent Neural Networks) 1.1 为什么选择序列模型?(Why Sequence Models?) 1.2 数学符号(Notation) 这个输入数据 ...
- 轻松上手SpringBoot Security + JWT Hello World示例
前言 在本教程中,我们将开发一个Spring Boot应用程序,该应用程序使用JWT身份验证来保护公开的REST API.在此示例中,我们将使用硬编码的用户和密码进行用户身份验证. 在下一个教程中,我 ...