知识点简单总结——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分解的更多相关文章

  1. 知识点简单总结——Pollard-Rho算法

    知识点简单总结--Pollard-Rho算法 MillerRabin算法 用于对较大(int64)范围内的数判定质数. 原理:费马小定理,二次探测定理. 二次探测定理:若 $ p $ 为奇素数且 $ ...

  2. LOJ129 Lyndon 分解

    Lyndon 分解 样例 样例输入 1 ababa 样例输出 1 2 4 5 样例输入 2 bbababaabaaabaaaab 样例输出 2 1 2 4 6 9 13 18 样例输入 3 azAZ0 ...

  3. HDU - 6761 Minimum Index (字符串,Lyndon分解)

    Minimum Index 题意 求字符串所有前缀的所有后缀表示中字典序最小的位置集合,最终转换为1112进制表示.比如aab,有三个前缀分别为a,aa,aab.其中a的后缀只有一个a,位置下标1:a ...

  4. 知识点简单总结——FWT(快速沃尔什变换),FST(快速子集变换)

    知识点简单总结--FWT(快速沃尔什变换),FST(快速子集变换) 闲话 博客园的markdown也太傻逼了吧. 快速沃尔什变换 位运算卷积 形如 $ f[ i ] = \sum\limits_{ j ...

  5. 知识点简单总结——minmax容斥

    知识点简单总结--minmax容斥 minmax容斥 好像也有个叫法叫最值反演? 就是这样的一个柿子: \[max(S) = \sum\limits_{ T \subseteq S } min(T) ...

  6. 知识点简单总结——BSGS与EXBSGS

    知识点简单总结--BSGS与EXBSGS BSGS 给出 $ A,B,C,(A,C)=1 $ ,要你求最小的 $ x $ ,使得 $ A^x \equiv B(mod \ C) $ . 在数论题中经常 ...

  7. XPath知识点简单总结(思维导图)

    XPath是一种用于在XML文档中查找信息的语言,其对HTML也有很好的支持,所以在网络爬虫中可用于解析HTML文档.参考链接. 下图是XPath知识点的简单总结成思维导图:

  8. nginx知识点简单回顾

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  9. lua语言自学知识点----简单了解

    零碎知识点: lua:用lua写UI,更新UI,因为lua可直接跨平台解析,不需要编译,方便更新------>热更新. c#反射也可以达到更新,但非常麻烦,切不支持iOS. 在lua中一个人汉字 ...

随机推荐

  1. html特殊字符(css3 content)

    由于偶尔用到,又经常忘记,所以把网上的资料考下来记录一下. <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. Graph Based SLAM 基本原理

    作者 | Alex 01 引言 SLAM 基本框架大致分为两大类:基于概率的方法如 EKF, UKF, particle filters 和基于图的方法 .基于图的方法本质上是种优化方法,一个以最小化 ...

  3. Golang Sync.WaitGroup 使用及原理

    Golang Sync.WaitGroup 使用及原理 使用 func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.A ...

  4. kubernetes集群之Pod说能不能让我体面的消亡呀?

    kubernetes集群之Pod说能不能让我体面的消亡呀? 由于 Pod 所代表的是在集群中节点上运行的进程,当不再需要这些进程时允许其体面地终止. 1.如果 preStop 回调所需要的时间长于默认 ...

  5. nginx拒绝国外IP访问

    nginx拒绝国外IP访问方法很多,比如iptables,geoip模块,域名解析等等.这些方法不会相互冲突,可以结合起来一起使用. 今天来教大家利用两个小方法解决  域名解析禁止掉海外IP访问网站. ...

  6. C# 中的Stream流

    流就是一个类的对象,很多文件的输入输出操作都以类的成员函数的方式来提供: 流其实是一种信息的转换,是有序的,有输入和输出流(IO); 1.FileStream 文件流,读取和保存文件操作使用: //写 ...

  7. textbox 实现跨操作系统换行的两种写法

    每个操作系统对换坏的解释都不一样.所以写代码的时候要注意这个细节: 要基于.net跨环境的基类去写,才能跨平台. Unix系统里,每行结尾只有"<换行>",即" ...

  8. 60天shell脚本计划-1/12-渐入佳境

    --作者:飞翔的小胖猪 --创建时间:2021年1月27日 --修改时间:2021年2月1日 说明 每日上传更新一个shell脚本,周期为60天.如有需求的读者可根据自己实际情况选用合适的脚本,也可在 ...

  9. VUE3 之 使用标签实现动画与过渡效果 - 这个系列的教程通俗易懂,适合新手

    1. 概述 巴纳姆效应告诉我们: 人们更容易相信笼统的.常见的人格描述,并觉得特别适合自己,认为该描述真实地反映了自己的人格面貌. 这也是所有算命先生的小把戏,算命先生通常把话说的很笼统,很通用,基本 ...

  10. ABP 使用ElasticSearch、Kibana、Docker 进行日志收集

    ABP 使用ElasticSearch.Kibana.Docker 进行日志收集 后续会根据公司使用的技术,进行技术整理分享,都是干货哦别忘了关注我!!! 最近领导想要我把项目日志进行一个统一收集,因 ...