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;
}
                    
                
                
            
        
浙公网安备 33010602011771号