首页 > 其他分享 >Lyndon 分解小记

Lyndon 分解小记

时间:2024-05-10 19:12:11浏览次数:29  
标签:... text Lyndon ge 分解 小记 define

来个简单的。

概念

  • Lyndon 串:一个字符串 \(s\) 被称为 Lyndon 串,当且仅当 \(s\) 整个串是所有后缀中严格最小的

例如 \(\mathtt{ababb},\ \mathtt{abcdefg}\)。

  • Lyndon 分解:将字符串 \(s\) 分解为 \(w_1,w_2,...,w_k\),满足 \(w_1 \ge w_2 \ge ... \ge w_k\),并且 \(w_1,w_2,...,w_k\) 都是 Lyndon 串。

例如 \(\mathtt {acaababc}\) 可以分解为 \(\mathtt {ac,aab,abc}\)。

性质

对于 Lyndon 串 \(u,v\),若 \(u<v\),那么 \(uv\) 也是 Lyndon 串

证明
  • 若 \(u\) 不是 \(v\) 的前缀,那么一定有 \(uv<v\)。

  • 若 \(u\) 是 \(v\) 的前缀,由于 \(v\) 是 Lyndon 串,那么 \(v\) 中以位置 \(|u|+1\) 开头的后缀 \(> v\),进而知 \(uv<v\)。

一个字符串 \(s\) 的 Lyndon 分解存在且唯一

存在性证明

令 \(w_1,w_2,...,w_{|s|}\) 分别为 \(s_1,s_2,...,s_{|s|}\),这些串都是 Lyndon 串。

对于 \(i<|s|\),如果 \(w_i < w_{i+1}\),那么合并 \(w_i,w_{i+1}\)。由性质①可知,合并后的串仍是 Lyndon 串。

一直合并,最后一定有 \(w_1 \ge w_2 \ge ... \ge w_k\)。

唯一性证明

使用反证法,若 \(s\) 有两种 Lyndon 分解:

  • \(s = w_1w_2...w_{i-1}w_iw_{i+1}...w_k\)

  • \(s = w_1w_2...w_{i-1}w_i'w_{i+1}...w_j'...w_{k'}\)

钦定 \(|w_i| \ge |w_i'|\),并且 \(w_i = w_i'w_{i+1}'...w_{j-1}'\text{pre}(w_j')\)。

那么 \(w_i \ge \text{pre}(w_j')\),设 \(\text{pre}(w_j')\) 在 \(w_i\) 中的开头位置为 \(p\),则 \(w_i \ge「w_i \text{ 中以位置 } p \text{ 开头的后缀}」\)

这与 \(w_i\) 是 Lyndon 串矛盾。

Duval 算法

Duval 算法以 \(O(n) - O(1)\) 的复杂度求出了一个字符串的 Lyndon 分解。

我们维护三个指针 \(i,j,k\),把 \(s\) 分成三段,分别为 \(s_{1...i-1},s_{i...k-1},s_{k...n}\)。

同时维护 \(s_{i...k-1}\) 的一个周期 \(p=k-j\),即 \(s_{i...k-1} = s_{i...i+p-1} ^ t + \text{pre} (s_{i...i+p-1})\),并且 \(s_{i...i+p-1}\) 是 Lyndon 串。

使用增量法,目前考虑加入字符 \(s_k\),分三种情况:

  • \(s_j = s_k\)

周期 \(p\) 仍然合法,令 \(j\gets j + 1\)。

  • \(s_j < s_k\)

可知 \(s_{i...k}\) 是一个 Lyndon 串,重新设置周期长度,令 \(j\gets i\)。

  • \(s_j > s_k\)

本轮分解完毕,得到 Lyndon 串 \(s_{i...i+p-1},s_{i+p...i+2p-1},s_{i+2p,i+3p-1},...\)。

每轮开始时,令 \(j\gets i,\ k\gets i + 1\)。

模板题

点击查看代码
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define fi first
#define se second
#define pir pair <ll, ll>
#define mkp make_pair
#define pb push_back
using namespace std;
const ll maxn = 5e6 + 10, inf = 1e17;
char s[maxn];
ll n, ans;
int main() {
	scanf("%s", s + 1); n = strlen(s + 1);
	for(ll i = 1; i <= n;) {
		ll j = i, k = i + 1;
		while(k <= n && s[j] <= s[k]) {
			if(s[j] == s[k]) ++j;
			else j = i;
			++k;
		}
		while(i <= j) {
			ans ^= i + k - j - 1;
			i += k - j;
		}
	}
	printf("%lld", ans);
	return 0;
}

这玩意可以直接求解最小表示法,这里懒得写了。

标签:...,text,Lyndon,ge,分解,小记,define
From: https://www.cnblogs.com/Sktn0089/p/18185129

相关文章

  • 日常问题小记
    (1)下图中,L186行中的"\"颜色为蓝色,与前两行的颜色不同,原因是L186的"\"不是该行的最后一个字符。 本例中,  L186的"\"后还存在2个空格字符将这2个空格字符删除 ......
  • B3716 分解质因子 3
    原题链接题解1.数组最大能开到1e82.vector比数组容易mle3.筛素数的时间复杂度是O(n)4.由于一个数最多有\(log_2(n)\)个因子,我们标记每一个合数的最小质因子,然后直接除就行(递归思想?)code#include<bits/stdc++.h>#definelllonglongusingnamespacestd;vector<ll>pr......
  • 侦听协议与目录协议小记
    侦听协议MESI协议“ReadHit”和“WriteHit”表示内核在本地缓存中读写命中并获得有效数据;“ReadMiss”和“WriteMiss”表示内核在本地缓存中读写缺失,未获得有效数据;“ProbeReadHit”和“ProbeWriteHit”表示内核在其他内核的Cache中读写命中,获得有效数据的副本。在......
  • SVD奇异值分解
    利用矩阵SVD分解,拟合直线与平面SVD分解奇异值分解(SingularValueDecomposition,以下简称SVD)就是解决最小二乘法的利器,它不仅可以拟合直线、平面,还可以得到点云的最小包围盒。关于SVD与最小二乘的数学原理和关联,可以直接网上搜索查找,资料大把。本文主要讲解其几何意义和代......
  • UHF RFID 使用小记
    1,概念UHF:UltraHighFrequency;超高频。RFID:RadioFrequencyIdentification;射频识别。电子标签:即RFID标签,是RFID的俗称。PDA:PersonalDigitalAssistant;个人数字助理。发卡器:对卡进行读写操作的工具。EPC:Electronicproductcode;电子产品代码。2,原理标签进入阅读器发出的......
  • Halo博客搭建小记
    准备工作阿里云服务器,操作系统为CentOS7.9.2009x86_64(Py3.7.9)宝塔面板Nginx1.24.0(用于反向代理)已备案的域名ssl证书(https访问)参考官方文档,这里使用DockerCompose进行部署官方文档:使用DockerCompose部署|Halo文档一、安装Docker和DockerCompose1、使用宝......
  • [学习笔记] 质数与唯一分解定理 - 数论
    素性测试素性测试就是判断某个数是否为质数。费马小定理内容:若\(p\)为质数,\(a\)为任意整数,有\(a^{p-1}\equiv1(mod\p)\)那么可以多次随机取一个基数\(a\in(1,p)\)若\(p\)满足上式,那么它为质数的可能性就越大。MillarRabin素性测试inlinellqpow(lla,lln,ll......
  • 推荐策略小记
    工作中在推荐小说、特效、陪玩的时候针对用户会有不同的推荐。这里主要讲一下推荐中存在的问题和解决方法。推荐:主要指的是通过用户和物品的关联(例如兴趣、文化、用户属性)给出用户感兴趣的物品。常见场景是满足用户「逛」的需求,通过抓手物品引出相似物品推荐,提高用户的停留时长......
  • 保序回归问题小记
    问题有\(n\)个点,给出一张DAG。你需要给每个点设立权值\(w_{1...n}\),满足对于每条边\((u,v)\)都有\(w_u\lew_v\),求\(\min\{\sum\limits_{i=1}^nb_i|w_i-a_i|^p\}\),其中\(a_i,b_i,p\)是给出的。整体二分考虑二分\(mid\),把DAG划分为权值\(\lemid\)和\(>mid\)......
  • 单位根反演小记
    反演公式\[[n|v]=\frac{1}{n}\sum_{0\lej<n}(\omega_n^v)^j\]证明很简单,等比数列求和即可。应用牛客Wannafly挑战赛11E白兔的***难题意:给定\(k\le2^20,n\le10^{16},p=998244353\),求\(t\in[0,k)\),\(a_t=\sum_{k|i,0\lei+t\len}\binom{n}{i+......