题解:P6114 【模板】Lyndon 分解
a_small_OIer · · 题解
P6114 【模板】Lyndon 分解
题意
我们定义一个字符串是 Lyndon Word,当且仅当当且仅当它严格小于它的所有非平凡后缀,即字典序最小的后缀是它本身。
给定一个字符串
例如样例 ababa,一个合法的划分是 ab(非平凡后缀为 b,严格大于 ab)、ab、a(没有非平凡后缀)。
所有答案是
*注:“非平凡后缀”指“非空真后缀”。
Duval 算法
求解 Lyndon 分解问题可以使用 Duval 算法。
我们将
考虑 Lyndon 串定义,
显然对于每个
由上述过程也可以看作是“任意字符串的 Lyndon 分解是唯一确定的”的构造性证明,读者可以自行思考。
代码
#include<bits/stdc++.h>
#define N 5000010
using namespace std;
typedef long long LL;
//十年OI一场空,不开long long见祖宗
char s[N];
int main(){
//freopen(".in" , "r" , stdin);
//freopen(".out" , "w" , stdout);
scanf("%s", s + 1);
int n = strlen(s + 1);
int ans = 0;
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 += 1;
k += 1;
}
while(i <= j){
ans ^= (i + k - j - 1);
i += (k - j);
}
}
printf("%d\n", ans);
return 0;
}