[POI2006]Periods of Words
2024-10-19 08:57:09
题目大意:
给定一个长度为$n(n\leq10^6)$的字符串$S$,定义一个串$S$的最大周期为一个不为$S$的字符串$Q$,满足$Q$为$S$的前缀且$S$为$QQ$的前缀。求字符串$S$的每一个前缀的最大周期长度之和。
思路:
KMP+DP。
不难发现串$S$去掉前缀串$Q$后,剩下的串是$Q$的最短非空前缀。首先用KMP算法求出$next$数组。然而$next$求出来是最长,要让它变成最短,需要用DP的思想,向前找到最初的非0$next$对应的长度$f_i$,最后求$\sum(i-f[i])$即可。
#include<cstdio>
typedef long long int64;
const int N=1e6+;
char s[N];
int n,next[N],f[N];
int main() {
scanf("%d%s",&n,s);
for(register int i=,j=next[]=-;i<n;next[++i]=++j) {
while(~j&&s[i]!=s[j]) j=next[j];
}
int64 ans=;
for(register int i=;i<=n;i++) {
f[i]=next[i]?f[next[i]]:i;
ans+=i-f[i];
}
printf("%lld\n",ans);
return ;
}
最新文章
- Why do we live in this world?
- C#接扣和抽象类
- 每日英语:A Different Color: China&#39;s Chameleonic Politics
- 1445 送Q币
- DOM0,DOM2,DOM3事件,事件基础知识入门
- 全排列 (codevs 1294)题解
- jquery cdn加速点
- net-ldap for ruby openNebula ldap
- 微信公众平台应用开发框架sophia设计不足(1)
- 《Qt on Android核心编程》介绍
- 将java项目打包为jar
- [NewLife.XCode]实体类详解
- Json的序列化与反序列化以及乱入的k_BackingField
- DDL触发器(用来控制用户的DDL行为)
- C# 哈希加密
- mono+jexus 部署之CompilationException
- Sql Server 2005 镜像后收缩日志
- 使用range()生成自然数序列
- 【转-mysql索引失效的几种情形】
- WPF根据数据项获取条目控件的方法-ItemContainerGenerator