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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步