作用
把一個大字串分成好多個小字串
這些小字串的最小字尾,就是其本身
求出這些小字串的右端點下標
#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;
}