对于一个仅含小写字母的字符串$q,p$ 为 \(a\) 的前缀且 \(a \ne p\),那么我们称 \(p\) 为 \(a\) 的 proper 前缀。
规定字符串 \(Q\)(可以是空串)表示 \(a\) 的周期,当且仅当 \(Q\) 是 \(a\) 的 proper 前缀且 \(a\) 是 $Q+Q$的前缀。
例如 ab
是 abab
的一个周期,因为 ab
是 abab
的 proper 前缀,且 abab
是 ab+ab
的前缀。
求给定字符串所有前缀的最大周期长度之和。
范围&性质:$1\le k\le 10^6$
借用别人的图,侵删
这里利用了next数组的性质:$next[i]$表示$i$的最长的前缀和后缀相同的长度
如图可得对于字符串$i$,令$j=i$,然后在$j>0$的情况下令$j=next[j]$最大周期就是$i-j$
#include<bits/stdc++.h>
using namespace std;
namespace zzc
{
const int maxn = 1e6+5;
int n;
long long ans;
char ch[maxn];
int nxt[maxn];
void work()
{
scanf("%d",&n);
scanf("%s",ch+1);
for(int i=2,j=0;i<=n;i++)
{
while(j&&ch[i]!=ch[j+1]) j=nxt[j];
if(ch[i]==ch[j+1]) j++,nxt[i]=j;
}
for(int i=2,j=2;i<=n;i++,j=i)
{
while(nxt[j]) j=nxt[j];
if(nxt[i]) nxt[i]=j;
ans+=i-j;
}
printf("%lld",ans);
}
}
int main()
{
zzc::work();
return 0;
}
P3435 [POI2006]OKR-Periods of Words KMP算法扩展
原文:https://www.cnblogs.com/youth518/p/13679775.html