首页 > 其他分享 >字符串学习笔记

字符串学习笔记

时间:2023-08-17 23:33:58浏览次数:40  
标签:text Lyndon 学习 ge 分解 笔记 字符串 字典

SAM (后缀自动机)

待补充

Lyndon 分解

定义:

定义一个串是 \(\text{Lyndon}\) 串,当且仅当此串的最小后缀为此串本身。

等价于该串为它所有循环表示中字典序最小的。

\(\text{Lyndon}\) 分解将任意串 \(S\) 划分成字符串序列,满足序列中每个串均为 \(\text{Lyndon}\) 串且每个串字典序均大于等于其之后的串。

可以证明这种划分存在且唯一,证明略。

算法:

引理 1:若串 \(u\) 和 \(v\) 都是 \(\text{Lyndon}\) 串且 \(u<v\),则 \(u+v\) 也是 \(\text{Lyndon}\) 串。

证明略。

引理2:若字符串 \(u\) 和字符 \(c\) 满足 \(u+c\) 是某个 \(\text{Lyndon}\) 串的前缀,则对于字符 \(d>c\) 有 \(u+d\) 是 \(\text{Lyndon}\) 串。

证明:

设该 \(\text{Lyndon}\) 串为 \(u+c+t\)。

则根据性质就有 \(\forall i \in [2,len(u)],u[i:]+c+t>u+c+t\),

也就是说 \(u[i:]+c\ge u\),(即为 \(u\) 的后缀加上字符 \(c\) 后字典序仍比 \(u\) 大)。

所以就有 \(u[i:]+d>u[i:]+c\ge u\)。

同时因为 \(c>u[1]\),就有 \(d>c>u[1]\)。

故 \(u+d\) 为 \(\text{Lyndon}\) 串。

\(\text{Duval}\) 算法:

这个算法可以在 $ \mathcal{O}(n)$ 时间复杂度,\(\mathcal{O}(1)\) 空间复杂度内求出一个字符串 \(S\) 的 \(\text{Lyndon}\) 分解。

维护三个变量 \(i,j,k\),\(i,k\) 将字符串分为三段。

\(S[:i−1]\) 为已经分解好且满足字典序非递增的 \(g\) 个 \(\text{Lyndon}\) 串。(\(s_1s_2s_3 \dots s_g\))

\(S[i,k−1]=t^h+v(h>1)\) 尚未分解,满足 \(t\) 是 \(\text{Lyndon}\) 串,且 \(v\) 是 \(t\) 的一个可为空且不等于 \(t\) 的前缀,且有 \(s_g>S[i,k-1]\)

程序实现时按顺序读入字符 \(S[k]\),令 \(j=k-|t|\)。

以 \(S[j]\) 和 \(S[k]\) 为依据分类讨论。

  • 当 \(S[k]=S[j]\) 时,直接 \(k\leftarrow k+1,j\leftarrow j+1\),尾部字符串 \(v\) 的周期 \(k-j\) 继续保持
  • 当 \(S[k]>S[j]\) 时,由 引理 2 可知 \(v+S[k]\) 是 \(\text{Lyndon}\) 串,由于 \(\text{Lyndon}\) 分解需要满足 \(s_i\ge s_{i+1}\),所以继续向前合并,并且最终整个 \(t^h+v+S[k]\) 会形成一个新的 \(\text{Lyndon}\) 串(所以将 \(j\) 调回 \(i\) 的位置继续判断)。
  • 当 \(S[k]<S[j]\) 时,\(t^h\) 的分解被固定下来,算法从 \(v\) 的开头处重新开始,之前的都归到 \(i\) 前的第一部分。

\(i\) 只会单调往右移动,同时 \(k\) 每次移动的距离不会超过 \(i\) 移动的距离,所以时间复杂度是 $ \mathcal{O}(n)$ 的。

核心代码:

for(int i=1;i<=n;){
	int j=i,k=i+1;
	while(k<=n && s[k]>=s[j]){ //前两种情况
		if(s[k]>s[j]) j=i;
		else ++j;
		++k;
	}
	while(i<=j){
        // 在此处获取字串信息
        // 每个字串的长度均为 k-j
		i+=k-j;
	}
}

一个子串的左端点为 \(i\),右端点为 \(i+k-j-1\)。

未完待续

标签:text,Lyndon,学习,ge,分解,笔记,字符串,字典
From: https://www.cnblogs.com/RoFtaCD/p/17638876.html

相关文章

  • 【安全学习之路】Day43
    ......
  • 七月学习之Firewalld富规则策略
    7、Firewalld富规则策略7.1、Rule基本介绍firewalld中的富规则表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置优先级在所有的防火墙策略中也是最高的7.2、Rule命令语法#富规则相关命令--add-rich-rule='<RU......
  • ERPNEXT 二次开发需要学习哪些技术?
    ERPNext是一款开源的企业资源规划(ERP)软件,用于管理企业的各种业务流程,包括财务、库存、采购、销售、人力资源等。要学习二开ERPNext,您需要掌握以下技术和概念:Python编程语言:ERPNext是用Python编写的,因此对Python编程语言的了解是必要的。您需要理解Python的基本语法、数据结......
  • 如何通过电影学习英语
        如何通过电影学英语 人的语言环境就好像沟通人体的血液;在语言环境中耳濡目染,才能真正“活学”,掌握语音,词汇、句型、思维和文化;在语言环境中入乡随俗,也才能真正“活用”,达到理解和表达、交流和沟通。 但是......
  • 机器学习-暑假学习01
    01赛题介绍用户新增预测挑战赛链接赛题数据由约62万条训练集、20万条测试集数据组成,共包含13个字段。其中uuid为样本唯一标识,eid为访问行为ID,udmap为行为属性,其中的key1到key9表示不同的行为属性,如项目名、项目id等相关字段,common_ts为应用访问记录发生时间(毫秒时间戳),其余字段......
  • 新人笔记-私有及其使用
    publicclassStudent02{privateStringname;privateintage;publicvoidsetName(Stringn){name=n;}publicStringgetName(){returnname;}publicvoidsetAge(inta){age=a;}publicint......
  • 8.17 模拟赛 & 学习笔记
    三天模拟赛+讲课,请的wyz大佬。主要是搞图论这一块。(大概能逃3天军训罢。)评价今日模拟赛:据说对标noip难度但显然放了很大的水。可惜好像手感很不好,是rank12/20。再接再厉?大家都强强强!我弱弱弱!模拟赛题目传送门A.泰拉大陆,原CF601A错因是小条件判错了??诶嘿。由于模拟......
  • 小白笔记,大神误入
    static:静态常量,其无法在运行时改变分配。结构体:我们自己创造出来的一种类型structBook{charname[14];shortprice;};以上的为结构体,大括号内的,为我们为这本书所列出的基本内容。为名字(name)和价格(price)char后面[]中表示的为这个为“名字”所申请的储存空间为20个字节的位置(一......
  • 操作系统学习2
    分别使用标准IO和系统IO写入一百万个整数到文件,测试谁的时间更短?为什么?结论:在同等数据的写入下,使用标准IO要比直接使用系统IO更快原因:标准IO有缓冲区机制,在执行fwrite写文件时,数据不是直接调用系统IO写入磁盘,而是先存放在内存的缓冲区中,直到缓冲区满后,才会调用一次系统IO全部......
  • 【算法学习笔记】DFN序求LCA(最近公共祖先)
    前置知识DFN序:对一棵树进行深度优先搜索DFS得到的结点序列,即深度优先搜索DFS的访问顺序。该表述不一定严谨,建议百度ST表(SparseTable,稀疏表)算法概述引理1.1在DFN序中祖先一定出现后代之前。考虑一树上的两个节点\(x\),\(y\)的最近公共祖先\(d\),设\(x\)的DFN序......