#include "bits/stdc++.h"
using namespace std;
const int N = 100005;
char s[N];
int ne[N];
int num[N];
int main(){
while(cin>>s+1) {
ne[0]=-1;
int len = strlen(s + 1);
for (int i = 2, j = 0; i <= len; i++) {
while (j && s[i] != s[j + 1]) j = ne[j];
if (s[i] == s[j + 1]) j++;
ne[i] = j;
}
//最大循环节的个数
// long long ans=1;
// if(len%(len-ne[len])==0) ans=len/(len-ne[len]);
// cout<<ans<<endl;
//最大循环节
long long ans=0;
for(int i=1;i<=len;i++){
if(ne[i]!=0){
num[i] = num[ne[i]] + (long long)(i-ne[i]);
ans+=num[i];
}
}
cout<<ans<<endl;
// 长度为i的循环节的长度:i-ne[i], 循环次数:i/(i-ne[i])
}
return 0;
}
最大循环节与最大循环节的个数KMP
于 2022-03-16 21:02:13 首次发布