OKR-Periods of Words
[POI2006] OKR-Periods of Words
题面翻译
对于一个仅含小写字母的字符串
规定字符串
例如 ab
是 abab
的一个周期,因为 ab
是 abab
的 proper 前缀,且 abab
是 ab+ab
的前缀。
求给定字符串所有前缀的最大周期长度之和。
样例 #1
样例输入 #1
8
babababa
样例输出 #1
24
数据范围
解析
字符串周期,阅读理解题。
如上图,将白
为了让
答案长度就是
求最短的前缀函数见 动物园,
但是暴力求解会
code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
long long n,p[N];
string s;
long long ans;
int main()
{
scanf("%lld",&n); cin>>s;
for(int i=1;i<n;i++)
{
int j=p[i-1];
while(j&&s[i]!=s[j]) j=p[j-1];
p[i]=j+(s[i]==s[j]);
}
for(int i=1;i<n;i++)
{
int j=p[i]; if(!j) continue;
while(p[j-1]) j=p[j-1];
p[i]=j;
ans+=i+1-j;
}
printf("%lld\n",ans);
return 0;
}
注意
KMP j=p[j-1]
,中的 j-1
是为了让长度和下标对齐。
P.S
有人疑惑为什么不用判断
我们可以假设
由于这部分重叠的既是前缀字符串的后缀,又是后缀字符串的前缀,所以整个字符串一定还有一个更短的
因此这个有重复部分的
蓝三角的
都是相同的,所以圈起来的更短。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」