码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu_P3435 [POI2006]OKR-Periods of Words KMP

时间:2019-10-23 09:59:34      阅读:77      评论:0      收藏:0      [点我收藏+]

标签:span   阅读   ace   http   数组   while   求和   rds   problem   

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\n",ans);
    return 0;
}

Luogu_P3435 [POI2006]OKR-Periods of Words KMP

标签:span   阅读   ace   http   数组   while   求和   rds   problem   

原文地址:https://www.cnblogs.com/ChrisKKK/p/11723881.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!