这篇博客讲的十分详细,下面对在看博客时卡壳的地方和代码(实现非常精妙)进行解释。
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<deque>
#include<cstdlib>
#include<ctime>
#define dd double
#define ld long double
#define ll long long
#define ull unsigned long long
#define N 5000010
#define M number
using namespace std;
const int INF=0x3f3f3f3f;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x*f;
}
char s[N];
int ans;
int main(){
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=1;i<=len;){
int j=i,k=i+1;
while(k<=len&&s[j]<=s[k]){
if(s[j]<s[k]) j=i;
else j++;
k++;
}
while(i<=j){
ans^=i+k-j-1;
i+=k-j;
}
}
printf("%d\n",ans);
return 0;
}
可以知道,代码中只用了三个指针就完成了对Lyndon的分解。
原文:https://www.cnblogs.com/TianMeng-hyl/p/14697364.html