链接
https://www.luogu.org/problemnew/show/P3435
大意
给定一个字符串,问它在 下能跳的长度总和,跳入起始位除外
思路
+ 优化
代码
#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);//输出
}