思路:
我们可以把周期理解为一个字符串复制一次可以包含另一个字符串
那么我们考虑对于abababa的周期
显然是ababab
既然ababa是它的最长前缀,那么我们可以考虑继续在里面寻找是否有更小的剩余长度
aba,很显然
再找,发现是a
那么我们就求出了答案
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n;
char s[1000100];
int next[1001000];
int find(int i)
{
if(next[i])
return next[i]=find(next[i]);
return i;
}
int main()
{
scanf("%d%s", &n,s+1);
int k=0;
for(int i=2; i<=n; i++)
{
while(k!=0&&s[k+1]!=s[i])
k=next[k];
if(s[k+1]==s[i])
k++;
next[i]=k;
}
long long ans=0;
for(int i=1; i<=n; i++)
ans+=i-find(i);
printf("%lld", ans);
return 0;
}