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相关组件 右键点击 项目 ...
随机推荐
- 深入探究.Net Core Configuration读取配置的优先级
前言 在之前的文章.Net Core Configuration源码探究一文中我们曾解读过Configuration的工作原理,也.Net Core Configuration Etcd数据源 ...
- 攻防世界——Misc新手练习区解题总结<1>(1-4题)
第一题this_if_flag: 第一题就不多说了,题目上就给出了flag复制粘贴就可以了 第二题pdf: 下载附件后,得到如下界面 Ctrl+a全选文字,复制出来看看是什么,粘贴后恰好得到flag ...
- wxmini
微信小游戏架构概览 https://www.jianshu.com/p/02199c35d749 微信小程序:工具配置 project.config.json https://www.cnblogs. ...
- VS提交码云权限问题
提交代码时出现Git failed with a fatal error. Authentication failed的问题. 如果没有像当前代码库提交过代码(所有项目),那么提交时会提示输入账号密码 ...
- 20190923-03Linux时间日期类 000 011
1.基本语法 date [OPTION]... [+FORMAT] 2.选项说明 表1-20 选项 功能 -d<时间字符串> 显示指定的“时间字符串”表示的时间,而非当前时间 -s< ...
- 20190923-01Linux帮助命令 000 009
man 获得帮助信息 1. 基本语法 man [命令或配置文件] (功能描述:获得帮助信息) 2.显示说明 表1-6 信息 功能 NAME 命令的名称和单行描述 SYNOPSIS 怎样使用命令 DES ...
- 【源码讲解】Spring事务是如何应用到你的业务场景中的?
初衷 日常开发中经常用到@Transaction注解,那你知道它是怎么应用到你的业务代码中的吗?本篇文章将从以下两个方面阐述Spring事务实现原理: 解析并加载事务配置:本质上是解析xml文件将标签 ...
- oracle之三rman 不完全恢复
rman 不完全恢复 9.1 rman 不完全恢复的三个标准模式:基于time.基于scn和基于sequence: 范例1:恢复过去某个时间点误操作,一般使用基于time或scn. 1)环境:有一套全 ...
- json模块:json.dumps()、json.loads()、json.dump()、json.load()
json.dumps().json.loads().json.dump().json.load() 4个方法的总结和使用: 注意:存在文件里面的东西,读出来都是字符串 import json 1.js ...
- xss中shellcode的调用
shellcode就是利用漏洞所执行的代码 在完整的xss攻击之中,会将shellcode存放在一定的地方,然后触发漏洞,引发shellcode. 1.远程调用执行js 可将js代码单独放在一个js文 ...