原题:https://www.lydsy.com/JudgeOnline/problem.php?id=1511
题解:求最长周期的和。通过分析很容易得出,最长周期应该是长度-最短前后缀相等的长度。我们知道 nxt为最长前缀,而要求最短前缀可以用dp来解决。
最长前缀为 i-f(i)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e6+10;
int n,nxt[N],f[N];
ll ans;
char t[N];
int main(){
// freopen("bzoj1511.in","r",stdin);
scanf("%d",&n);
scanf("%s",t+1);
nxt[0]=-1;ans=0;
for(int i=1,j,p;i<=n;i++){
j=nxt[i-1];
while(j!=-1 && t[i] != t[j+1]) j=nxt[j];
nxt[i]=++j;
if(nxt[i]) f[i]=f[nxt[i]];
else f[i]=i;
ans=ans+i-f[i];
}
printf("%lld\n",ans);
return 0;
}