Lyndon 分解模板

https://www.luogu.com.cn/problem/P6114

#include <bits/stdc++.h>
using namespace std;
const int N=5e6+5;
char s[N];
int n,ans;
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])j=s[j]==s[k++]?j+1:i;
		while(i<=j)i+=k-j,ans^=i-1;
	}
	cout<<ans;
}
posted @ 2022-07-13 09:56  pengyule  阅读(29)  评论(0)    收藏  举报