• 知识点简单总结——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
    ",ans);
    	// for(int i=1;i<=pc;i++) printf("%d ",prt[i]);putchar('
    ');
    	return 0;
    }
    }
    int main(){return RKK::main();}
    

    应用:

    我基本没看到过用Lyndon分解的题。

    随便来一个:CF594E Cutting the Line

  • 相关阅读:
    卡片悬停效果制作
    一个简单的登录页
    登录oracle ORA-12541: TNS:no listener报错
    Tomcat启动超时问题Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    获取input type=radio属性的value值
    Mybatic逆向工程的使用
    Mysql下载与安装
    JQuery操作input
    Java集合list,map,set区别及遍历
    List<Map<String, Object>>取值
  • 原文地址:https://www.cnblogs.com/rikurika/p/12848659.html
Copyright © 2020-2023  润新知