知识点简单总结——Lyndon分解
知识点简单总结——Lyndon分解
Lyndon串
定义:一个字符串的最小后缀就是整个串本身。
等效理解:这个串为其所有循环表示中最小的。
Lyndon分解
定义:将字符串分割为 $ s_{1} s_{2} ... s_{k} $ 任意段使得每一段都是Lyndon串且 $ \forall i < j , s_{i} \ge s_{j} $ 。
引理一:若 $ u < v $ 且 $ u , v $ 均为Lyndon串,则 $ uv $ 为Lyndon串。
关于证明,它咕了。
引理二:Lyndon分解存在且唯一。
存在性:全部分成单个字符后利用引理一合并。
唯一性:假设存在两种Lyndon分解分别为
$ s_1 s_2 ... s_{i} s_{i+1} ... $
$ s_1 s_2 ... s_{i} ' s_{i+1} ' ... $
不妨设 $ | s_{i} | > | s_{i} ' | , s_{i} = s_{i} ' s_{i+1} ' ... s_{k} ' [ 1...l ] $ , 其中 $ s_{k} ' [ 1...l ] $ 为这这一部分串的非空前缀。
有 $ s_{i} < s_{k} ' [ 1...k ] \le s_{k} ' \le s_{i} ' < s_{i} $ ,矛盾。
引理三:若有字符串 $ v $ ,字符$ c , d $ , $ d > c $ ,且 $ vc $ 为一个Lyndon串的前缀,则有 $ vd $ 为Lyndon串。
关于证明,它也咕了。
求Lyndon分解
可以用单调栈或者后缀数组啥的,但是复杂度不够好。
Duval算法
维护三个指针 $ i,j,k $
表示 $ s [ 1 , i - 1 ] $ 已经划分完了
$ s [ i , k - 1 ] $ 是一个Lyndon串 $ t $ 的周期循环 $ t^{g} + v $ ( $ v $ 是 $ t $ 的前缀)周期 $ t = k - j $ ,且保证 $ s [ i , k - 1 ] $ 小于前面已经划分好的串。
分情况讨论:
$ s[k] == s[j] $ :周期不变, $ j++ , k++ $ 。
$ s[k] > s[j] $ :根据引理三可知 $ v + s[k] $ 是Lyndon串,向前合并使得 $ s[i,k] $ 变成新的Lyndon循环节, $ j=i , k++ $ 。
$ s[k] < s[j] $ :将循环节逐个固定成划分结果。
以下是洛谷P6114 【模板】Lyndon 分解的代码。
#include<bits/stdc++.h>
using namespace std;
namespace RKK
{
char s[5000011];int n;
int prt[5000011],pc;
int main()
{
scanf("%s",s+1),n=strlen(s+1);
int i=1,j,k,ans=0;while(i<=n)
{
for(j=i,k=i+1;k<=n&&s[k]>=s[j];k++) s[k]>s[j]?j=i:j++;
while(i<=j) ans^=i+k-j-1,prt[++pc]=i+k-j-1,i+=k-j;
}
printf("%d\n",ans);
// for(int i=1;i<=pc;i++) printf("%d ",prt[i]);putchar('\n');
return 0;
}
}
int main(){return RKK::main();}
应用:
我基本没看到过用Lyndon分解的题。
随便来一个:CF594E Cutting the Line
知识点简单总结——Lyndon分解的更多相关文章
- 知识点简单总结——Pollard-Rho算法
知识点简单总结--Pollard-Rho算法 MillerRabin算法 用于对较大(int64)范围内的数判定质数. 原理:费马小定理,二次探测定理. 二次探测定理:若 $ p $ 为奇素数且 $ ...
- LOJ129 Lyndon 分解
Lyndon 分解 样例 样例输入 1 ababa 样例输出 1 2 4 5 样例输入 2 bbababaabaaabaaaab 样例输出 2 1 2 4 6 9 13 18 样例输入 3 azAZ0 ...
- HDU - 6761 Minimum Index (字符串,Lyndon分解)
Minimum Index 题意 求字符串所有前缀的所有后缀表示中字典序最小的位置集合,最终转换为1112进制表示.比如aab,有三个前缀分别为a,aa,aab.其中a的后缀只有一个a,位置下标1:a ...
- 知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)
知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j ...
- 知识点简单总结——minmax容斥
知识点简单总结--minmax容斥 minmax容斥 好像也有个叫法叫最值反演? 就是这样的一个柿子: \[max(S) = \sum\limits_{ T \subseteq S } min(T) ...
- 知识点简单总结——BSGS与EXBSGS
知识点简单总结--BSGS与EXBSGS BSGS 给出 $ A,B,C,(A,C)=1 $ ,要你求最小的 $ x $ ,使得 $ A^x \equiv B(mod \ C) $ . 在数论题中经常 ...
- XPath知识点简单总结(思维导图)
XPath是一种用于在XML文档中查找信息的语言,其对HTML也有很好的支持,所以在网络爬虫中可用于解析HTML文档.参考链接. 下图是XPath知识点的简单总结成思维导图:
- nginx知识点简单回顾
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- lua语言自学知识点----简单了解
零碎知识点: lua:用lua写UI,更新UI,因为lua可直接跨平台解析,不需要编译,方便更新------>热更新. c#反射也可以达到更新,但非常麻烦,切不支持iOS. 在lua中一个人汉字 ...
随机推荐
- C++ 实现 Parsec
前一段时间看到了梨梨喵聚聚写的Parser Combinator 在 C++ 里的 DSL, 感觉好厉害, 正好毕设里要写一部分前端, 昨天又把这篇文章看了一遍, 想着我也要用这么酷炫的东西来参与一下 ...
- Solution -「洛谷 P6021」洪水
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的带点权树,删除 \(u\) 点的代价是该点点权 \(a_u\).\(m\) 次操作: 修改单点点权. ...
- 抓取并解密HTTPS流量
WireShark Wireshark解密TLS数据流,从网上已有资料来看,主要是两种方式:一是服务端私钥直接解密,二是使用SSLKEYLOGFILE获取握手过程中的会话密钥信息进行解密. 这 ...
- c++ struct enum union加typedef与不加typedef
struct/enum/union加typedef与不加typedef 匿名结构体 struct { int a; int b; } v; // 这里表示定义了一个结构体的变量v,且结构体类型没有名字 ...
- 小程序入门心得(不谈api)
小程序入门 一.准备 首先先去微信公众平台注册一个小程序账号,去拿到一个AppID(没AppID也可以开发,只是有些功能会受限),注册成功后到开发设置获取自己的AppID,即使有AppID有些功能还是 ...
- Linux性能优化之磁盘I/O性能指标
讨论指标之前,得先解决两个概念:文件系统和磁盘I/O栈. 文件系统是什么?文件系统是在磁盘的基础上,提供了一个用来管理文件的树状结构.简言之,文件系统是树状结构,一种数据结构~逻辑上的概念.磁盘大家都 ...
- java中的interface(接口)
概念 usb插槽就是现实中的一个接口 你可以把u盘都插在usb插槽上,而不用担心买来的u盘插不进插槽中不管是插电脑,还是插相机,还是插收音机原因是做usb的厂家和做各种设备的厂家都遵守了统一的规定包括 ...
- 【Azure API 管理】API Management如何有效且快速更新呢?如对APIs/Policy等设置内容
问题描述 APIM中的内容(API, Policy)等内容,如果有需要更新时候,通常可以在Azure APIM门户上操作,通过一个接口一个设置的修改,也可以针对一个接口导入/导出的方式修改.当APIM ...
- 以Docker容器的形式运行GVM-11
OpenVAS(Open Vulnerability Assessment System)是在nessus基础上发展起来的一个开源的漏洞扫描程序,其核心部件是一套漏洞测试程序,可以检测远程系统和应用程 ...
- 三种移除list中的元素(可靠)
/** * 直接使用foreach方法移除list中的元素会抛异常 * Exception in thread "main" java.util.ConcurrentModific ...