Luogu_P3435 [POI2006]OKR-Periods of Words KMP
Posted chriskkk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Luogu_P3435 [POI2006]OKR-Periods of Words KMP相关的知识,希望对你有一定的参考价值。
Luogu_P3435 [POI2006]OKR-Periods of Words
### KMP
题目链接
阅读理解
其实就是B是A的前缀
那么叠加B成为BB,假如A是BB的前缀那么B就是合法
问A的所有前缀的最大合法前缀的和
emmm感性理解吧
那么读懂题面也就可以解决了
KMP的(nxt[])数组就是自我匹配的位置
而且(nxt[])是可以递推,假如(nxt)都不为(0)
(nxt[x])和(nxt[nxt[x]])的末尾都是x这个数
为了求最长,就让(nxt[i])最短,让(nxt[x]=nxt[nxt[x]])
那么(i-nxt[i])就是最长的长度
所有前缀求和就可以了
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,nxt[1000010];
long long ans;
char s[1000010];
int main()
{
cin>>n>>(s+1);
for(int i=2,j=0;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=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);
return 0;
}
以上是关于Luogu_P3435 [POI2006]OKR-Periods of Words KMP的主要内容,如果未能解决你的问题,请参考以下文章
Luogu 3435 POI2006OKR-Periods of Words(kmp)
P3435 [POI2006]OKR-Periods of Words
P3435 [POI2006]OKR-Periods of Words