首页 > 其他分享 >Lyndon 分解

Lyndon 分解

时间:2023-05-03 20:00:17浏览次数:30  
标签:std 引理 前缀 int Lyndon 分解 gets

Lyndon 串:\(s<{\rm suf}'(s)\) 的串 \(s\) 为 Lyndon 串。

引理 1:若 \(u\)、\(v\) 为 Lyndon 串,\(u<v\),则 \(uv\) 也为 Lyndon 串。

引理 2:若 \(uc\) 为 Lyndon 串的前缀,则 \(uc'(c'>c)\) 为 Lyndon 串。

证明:TODO...

求 \(s\) 的 Lyndon 分解,考虑增量构造。

维护 \(t\) 形如 \(u^xu'\),\(u\) 为 Lyndon 串,\(u'\) 为 \(u\) 的真前缀。\(t\) 前的 Lyndon 已确定。

维护 \(t\) 的位置 \([i,k]\) 及 \(j=k-|u|\)。分类讨论:

  • \(s_j=s_k\):
    • 继续增量过程。
    • \(k\gets k+1\),\(j\gets j+1\)。
  • \(s_j<s_k\):
    • 由引理 2,\(u's_j\) 为 Lyndon 串 \(u\) 的前缀,因此 \(u's_k\) 为 Lyndon 串。
    • 同时 \(u^y<u's_k(y\ge 1)\),由引理 1,\(u\gets u^xu's_k\)。
    • \(k\gets k+1\),\(j\gets i\)。
  • \(s_j>s_k\):
    • \(u's_j\) 无法与 \(u^y(y\ge 1)\) 组成 Lyndon 串,因此将 \(u^x\) 分为 \(x\) 个 \(u\),归入 \(s\) 的 Lyndon 分解。
    • \(i\gets i+\lfloor \dfrac{j-i}{k-j}\rfloor+1\)。

\(i,j,k\) 单调增,时间复杂度 \(\mathcal{O}(n)\)。

/* luogu_p6114.cpp */
#include <bits/stdc++.h>

int main() {
    std::cin.tie(nullptr)->sync_with_stdio(false);
    std::string a; std::cin >> a;
    int n = int(a.size());
    int ans = 0;
    for (int i = 0; i < n; ) {
        int j = i, k = i + 1;
        for (; k < n && a[j] <= a[k]; ++k) j = a[j] < a[k] ? i : j + 1;
        while (i <= j) ans ^= (i += k - j);
    }
    std::cout << ans << '\n';
    return 0;
}

标签:std,引理,前缀,int,Lyndon,分解,gets
From: https://www.cnblogs.com/jrjyy/p/17369596.html

相关文章

  • Lyndon 分解
    现在只会lyndon分解怎么写。所以先放在这里占坑。以后补Runs和LyndonTree相关知识。大量抄pdf和cmd博客。LyndonWord及其相关性质定义:若字符串\(s\)的最小后缀是它本身,则它是一个LyndonWord。LyndonWord没有Border。证明:如果存在,则border作为后缀比......
  • Lyndon 小记
    神秘科技。定义一个串为Lyndon串,当且仅当这个串的最小表示法是它本身。定义一个串的拆分为Lyndon分解,当且仅当每个拆分都是Lyndon串,且\(s_i\geqs_{i+1}\)。求出某个串的Lyndon分解可以用Duval算法,该算法可以\(O(n)\)求出这个串的Lyndon分解。这个算法的流程如......
  • 对矩阵乘以矩阵的转置和矩阵进行奇异值分解得到的向量是一样的。
    w=rand(4,6)[Ud,Sd,Vd]=svds(w/6,4)[Ud1,Sd1,Vd1]=svds(w*w'/6,4)发现Ud和Ud1的向量值是一样的,或者是相反的。  ......
  • MATLAB代码:基于benders分解算法的两阶段鲁棒问题求解
    MATLAB代码:基于benders分解算法的两阶段鲁棒问题求解关键词:两阶段鲁棒benders分解法 鲁棒优化参考文档:《Solvingtwo-stagerobustoptimizationproblemsusingacolumn-and-constraintgenerationmethod》(问题背景是这个文献,benders分解过程见CSDN)仿真平台:MATLABYALMIP......
  • 将TDateTime值分解为小时、分钟、秒和毫秒,以及计算时间差
     将时间日期分解procedureTForm1.Button1Click(Sender:TObject);varPresent:TDateTime;Year,Month,Day,Hour,Min,Sec,MSec:Word;beginPresent:=Now;SysUtils.DecodeDate(Present,Year,Month,Day);Label1.Caption:='TodayisDay'+I......
  • 质数和分解
    #include<iostream>#include<string.h>usingnamespacestd;constintN=210;intm;intf[N][N];intprimes[N];intcnt=1;boolst[N];voidinit(){for(inti=2;i<=200;i++){if(!st[i])primes[cnt++]=i;for(intj=1;......
  • HJ82_将真分数分解为埃及分数_数学
    参考高赞答案思路:将真分数分子、分母分别x2。目的使循环:分母除分子余数为0存在。1importsys2a=[]3forlineinsys.stdin:4a.append(line.strip().split("/"))5foriina:6l=[]7a=int(i[0])*28b=int(i[1])*29whilea:10......
  • 奇异值分解(SVD)和图像压缩
    在本文中,我将尝试解释SVD背后的数学及其几何意义,还有它在数据科学中的最常见的用法,图像压缩。奇异值分解是一种常见的线性代数技术,可以将任意形状的矩阵分解成三个部分的乘积:U、S、V。原矩阵A可以表示为:具体来说,A矩阵中的奇异值就是\Sigma矩阵中的对角线元素,它们是矩阵A的......
  • SVD奇异值分解
    1.奇异值分解的原理  以上图形可以表示为: uivi结果为秩1矩阵。  2.奇异值分解的应用(1)图像压缩对角矩阵中奇异值较大的排在前面,这些也是影响最大的因素,因此可以将后面的小奇异值去掉,进行图像压缩   (2)时空矩阵   ......
  • HJ82_将真分数分解为埃及分数_数学
    原文连接:(7条消息)将真分数分解为埃及分数_且_听_风_吟的博客-CSDN博客     1a,b=8,112a=a*103b=b*104res=[]5whilea:6foriinrange(a,0,-1):7print(i,b)8if(b%i==0):9print(i,b,a,r......