Lyndon分解
定义:
Lyndon串:的所有后缀中,是一个最小的后缀,则称为一个Lyndon串
Lyndon分解:将一个字符串分解为 ,
性质:
1.有两个Lyndon串 ,则也为一个Lyndon串
2.若存在字符串,以及字符 , 满足为某个Lyndon串的前缀,则有
- Lyndon分解对于一个串是唯一的
Duval 方法:
一个可以在的时空复杂度里面求出一个串的Lyndon分解
流程:
维护三个指针从做向右依次求出Lyndon分解
假定的字符串已经被分解完成
初始化
考虑在以为起点的串 一直延伸下去满足 , 并且表示为若干个相同的字符串T以及T的一个真前缀v拼接而成
😒 j,k$同时延伸就好了
的时候,因为需要满足Lyndon性质,不满足了
于是就把重新当成一个Lyndon串
合法性: 考虑此时 也应当为一个Lyndon
的时候,此时这 若干个已经是段Lyndon串了,直接跳到v即可
代码:
#include<bits/stdc++.h>
#define MAXN 5000005
using namespace std;
int n,ans;
char s[MAXN];
int main(){
scanf("%s" , s + 1) , n = strlen(s + 1);
for(int i = 1 ; i <= n;){
int j = i , k = i + 1;
while(k <= n && s[j] <= s[k]){
if(s[j] < s[k])j = i;
else j++;
k++;
}
while(i <= j){
ans = ans ^ (i + k - j - 1);
i = i + k - j;
}
}
cout<<ans<<endl;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下