Lyndon 分解

作用
把一个大字符串分成好多个小字符串
这些小字符串的最小后缀,就是其本身

求出这些小字符串的右端点下标

#include<bits/stdc++.h>
using namespace std;
char s[5000005];
int n,ans;
vector<int> a;
int main()
{
	scanf("%s",s+1);
	n=(int)strlen(s+1);
	int x;
	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)//从v的开头重新开始
		{
			x=i+k-j-1;//x就是那个下标。 
			//cout<<x<<' ';
			//a.push_back(x);//可以把x存进数组里 
			i+=k-j;
		}
	}
	
	ans=0;
	for(int i=0;i<a.size();i++)
	{
		//cout<<a[i]<<' ';
		ans^=a[i];
	}
	cout<<ans;
	return 0;
}
posted @   涤生yang  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示