【KMP】洛谷P3435 [POI2006]OKR-Periods of Words

链接

https://www.luogu.org/problemnew/show/P3435

大意

给定一个字符串,问它在 k m p 下能跳的长度总和,跳入起始位除外

思路

k m p + x j b 优化

代码

#pragma once
#include<cstdio>
using namespace std;int n,nxt[1000001],j;
char s[1000001];
long long ans;
signed main()
{
    scanf("%d\n%s",&n,s);
    for(register int i=1;i<n;i++)
    {
        while(j&&s[i]!=s[j]) j=nxt[j];
        if(s[i]==s[j])nxt[i+1]=++j;//求next数组
    }
    for(register int i=1;i<=n;i++)  
    {
        j=i;
        while(j&&nxt[j]) j=nxt[j];
        if(nxt[i]) nxt[i]=j;//记忆化
        ans+=(long long)(i-j);//求和
    }
    printf("%lld",ans);//输出
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81774613