OKR-Periods of Words
Posted fangbozhen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OKR-Periods of Words相关的知识,希望对你有一定的参考价值。
题目描述
定义字符串Q为字符串A的周期,当且仅当Q是A的前缀(不等于A),且A是QQ的前缀。求所有前缀的最大周期长度之和。
思路
我们看数据范围,显然要O(n)处理,所以我们对每一个前缀都应该用常数级的复杂度找到其最大周期。我们考虑周期的定义,实际上就是要找到一段Q=A[ 1...len],并且A[len+1...n] = Q [1...n-len ],因此A[1...n-len] = A[len+1...n],这就是KMP所求的,最长公共前后缀。所以最大周期就是n-最短公共前后缀,因为Q=n-公共前后缀。所以我们不断j=p[j],这样得到最小值就是我们求得最短公共前后缀,答案加上即可。不过由于一步步跳效率会低,我们可以优化,一次跳完直接更新p数组。
代码
#include <bits/stdc++.h> using namespace std; const int MAXN=1e6+10; char s[MAXN]; int pre[MAXN]; int main() int n; scanf("%d",&n); scanf(" %s",s+1); int j=0;pre[1]=0; for(int i=1;i<n;i++) while(j>0&&s[i+1]!=s[j+1])j=pre[j]; if(s[i+1]==s[j+1])j++; pre[i+1]=j; long long ans=0; for(int i=1;i<=n;i++) j=i; while(pre[j])j=pre[j]; if(pre[i]!=0)pre[i]=j; //优化 ans+=i-j; printf("%lld",ans); return 0;
以上是关于OKR-Periods of Words的主要内容,如果未能解决你的问题,请参考以下文章
OKR-Periods of Words「POI 2006」