题意就是把每个子串的最大周期加起来
不难想到 KMP,nxt数组处理的是最近的位置,也就是最短的周期,怎么弄到最大周期呢?不难发现,沿着nxt往上跳,跳到不能跳之后,就是最大周期
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
const int M=1005000;
int n;
int nxt[M];
char s[M];
signed main()
{
cin>>n;scanf("%s",s+1);
int k=0;
for (int i=2;i<=n;i++)
{
while (k&&s[i]!=s[k+1]) k=nxt[k];
if (s[k+1]==s[i]) k++;
nxt[i]=k;
}
lli ans=0;
for (int i=1;i<=n;i++)
while (nxt[nxt[i]]) nxt[i]=nxt[nxt[i]];
for (int i=1;i<=n;i++)
if (nxt[i]) ans+=(i-nxt[i]);
cout<<ans;
return 0;
}