[Luogu P3435] OKR-Periods of Words

#include<cstdio>
#include<cstring>
using namespace std;
char s[1000010];
long long nxt[1000010];
long long pos(long long x)
{
    return nxt[x]==0?x:nxt[x]=pos(nxt[x]);
}
int main()
{
    long long n,m,i,j,k,len,ans=0;
    scanf("%lld",&len);
    scanf("%s",s);
    i=0;j=0;
    nxt[0]=nxt[1]=0;
    for(i=1;i<=len-1;i++)
    {
        while(j&&s[i]!=s[j])j=nxt[j];
        if(s[i]==s[j])nxt[i+1]=++j;
        else nxt[i+1]=0;
    }
    //for(i=0;i<=len;i++)printf("%d ",nxt[i]);
    //printf("gocha\n");
    for(i=len;i>=1;i--)
    {
        ans+=i-pos(i);
    }
    printf("%lld\n",ans);
    return 0;
}
/*
8
babababa
*/

猜你喜欢

转载自www.cnblogs.com/Rain142857/p/11789464.html