Lyndon 分解

涤生yang發表於2024-04-22

作用
把一個大字串分成好多個小字串
這些小字串的最小字尾,就是其本身

求出這些小字串的右端點下標

#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;
}

相關文章