P3435 [POI2006]OKR-Periods of Words(kmp)
#include<cstdio>
#include<iostream>
using namespace std;
const int N=1000005;
int n;
long long ans;
char s[N];
int nxt[N];
int main(){
scanf("%d",&n);
scanf("%s",s+1);
int j=0;
for(int i=2;i<=n;i++){
while(j&&s[i]!=s[j+1]) j=nxt[j];
if(s[i]==s[j+1]) j++;
nxt[i]=j;
}
for(int i=1;i<=n;i++){
j=i;
while(nxt[j]) j=nxt[j];
if(nxt[i]!=0) nxt[i]=j;
ans+=i-j;
}
printf("%lld",ans);
return 0;
}