OKR-Periods of Words「POI 2006」
题目描述
串是有限个小写字符的序列,特别的,一个空序列也可以是一个串。一个串 P 是串 A 的前缀,当且仅当存在串 B,使得 A = PB。如果 P != A 并且 P 不是一个空串,那么我们说 P 是 A 的一个 proper 前缀。
定义 Q 是 AA 的周期,当且仅当 Q 是 A 的一个 proper 前缀并且 A 是 Q+Q 的前缀(不一定要是 proper 前缀)。比如串 abab 和 ababab 都是串 abababa 的周期。串 A 的最大周期就是它最长的一个周期或者是一个空串(当 A 没有周期的时候),比如说,ababab 的最大周期是 abab。串 abc 的最大周期是空串。
给出一个串,求出它所有前缀的最大周期长度之和。
输入格式
第一行一个整数 kk,表示串的长度。
接下来一行表示给出的串。
输出格式
输出一个整数表示它所有前缀的最大周期长度之和。
样例
样例输入
8
babababa
样例输出
24
数据范围与提示
对于全部数据,1 < k < 10^6
解释一下题意:
跑一遍样例,babababa的前缀对应的最大周期长度分别是是00224466
如果你还没有看懂就只好自己yy一下了。
拿bababa来说,它的最大周期是baba不能为自己也不能为空串。
那我们很容易发现一个奇妙的性质那就是一个串的最大周期长度=len-最小前缀==后缀(非空)长度。
证明;
设一个串为a1,a2,a3……am,它的最小非空前缀等于后缀的长度为n
则显然可以取a1~a(m-n)作为周期。因为a(m-n+1)~a(m)=a1~an(定义),所以a1~am是a1~an+a1~an的前缀。
并且这个周期显然最大(n最小,m-n最大)。
这样这道题就很简单了,不过注意有可能会超时。这里要用dp的思想。dp[i]表示以i为结尾的前缀最小前缀==后缀长度,显然dp[i] = dp[nxt[i]](nxt[i]是最大前缀=后缀长度).
这样就珂做了。
#include <iostream>
using namespace std;
long long k, l;
long long f[];
long long nxt[], ans;
char s[];
int main() {
//freopen("test.in", "r", stdin);
cin >> k;
scanf("%s", s + );
for (long long i = , j = ; i <= k; i++) {
while (j && s[j + ] != s[i]) j = nxt[j];
if (s[i] == s[j + ]) j++;
nxt[i] = j;
}
for (long long i = ; i <= k; i++) {
f[i] = f[nxt[i]];
if (f[i] == && nxt[i] != ) {
long long l = nxt[i];
if (l == ) continue;
while (nxt[l]) {
l = nxt[l];
}
f[i] = l;
} else if (f[i] == ) {
continue;
}
ans += i - f[i];
}
cout << ans;
return ;
}
OKR-Periods of Words「POI 2006」的更多相关文章
- 「POI 2010」Bridges
题目链接 戳我 \(Solution\) 看到"最大值最小",就知道应该要二分 二分之后,对于每个\(mid\),只要计算小于\(mid\)的边,然后在剩下的图中判断有无欧拉回路 ...
- 「HAOI 2006」数字序列
Description 给定一长度为 \(n\) 的数列 \(a\),可将 \(a_i\) 改为任意整数 \(k\),代价为 \(\mid a_i-k\mid\). 问最少改变多少个数能把它变成一个单 ...
- Solution -「CEOI 2006」「洛谷 P5974」ANTENNA
\(\mathcal{Description}\) Link. 给定平面上 \(n\) 个点,求最小的能覆盖其中至少 \(m\) 个点的圆半径及一个可能的圆心. \(n\le500\),坐 ...
- Solution -「POI 2011」「洛谷 P3527」MET-Meteors
\(\mathcal{Description}\) Link. 给定一个大小为 \(n\) 的环,每个结点有一个所属国家.\(k\) 次事件,每次对 \([l,r]\) 区间上的每个点点权加上 ...
- Solution -「POI 2014」「洛谷 P5904」HOT-Hotels 加强版
\(\mathcal{Description}\) Link. 给定一棵 \(n\) 个点的树,求无序三元组 \((u,v,w)\) 的个数,满足其中任意两点树上距离相等. \(n\le1 ...
- Solution -「POI 2010」「洛谷 P3511」MOS-Bridges
\(\mathcal{Description}\) Link.(洛谷上这翻译真的一言难尽呐. 给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...
- SpringBoot图文教程17—上手就会 RestTemplate 使用指南「Get Post」「设置请求头」
有天上飞的概念,就要有落地的实现 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例都敲一遍 先赞后看,养成习惯 SpringBoot 图文教程系列文章目录 SpringBoot图文教程1-Spr ...
- WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
前言 接着上周写的截图控件继续更新 绘制方框与椭圆. 1.WPF实现截屏「仿微信」 2.WPF 实现截屏控件之移动(二)「仿微信」 3.WPF 截图控件之伸缩(三) 「仿微信」 正文 有开发者在B站反 ...
- 前端构建工具之gulp(一)「图片压缩」
前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ...
随机推荐
- win10 安装"pip install orange3" 出现LINK : fatal error LNK1158: cannot run 'rc.exe' 错误的解决办法
解决办法: 从(本例使用的是64位的python3.6 注意:如果python的版本是32位,则使用x86:如果是64位,则使用x64;) 复制一下两个文件 rc.exe rcdll.dll 到
- 【网摘自CSDN网站】当文本内容过多,展开更多 (css控制,)
<div class="more"><p class="btn">显示全部内容</p></div> .more ...
- SpringBoot常用注解解析
@RestController 将返回的对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中.绝大部分情况下都是直接以 JSON 形式返回给客户端,很少的情况下才会以 ...
- 【协作式原创】查漏补缺之Go的slice基础和几个难点
[转载]队友博客 Q: 为啥要字节对齐的 https://www.nowcoder.com/discuss/57978 TODO: Q: go反汇编指令 go tool compile -S plan ...
- JAVA高级编程数据源datasource
原文链接 数据源 通过jdbc连接数据库,多建立几条连接放在数据源里面.可以设置数据源的最大连接数,同时活跃的连接数,最少空闲的连接数,能够同时接收处理的连接数等等. dbcp数据源 需要的jar包: ...
- nginx 性能优化的概述及在CPU资源方面的处理
nginx的性能优化的概述 软件层面的提升硬件的使用率 增大CPU的利用率 增大内存的利用率 增大磁盘IO利用率 增大网络带宽利用率 提升硬件规格 网卡:万兆网卡.例如10G.25G.40G等 磁盘: ...
- 十二 INPUT逻辑视图的配置,回显错误信息
Action接口中提供了五个逻辑视图的名称 SUCCESS ERROR LOGIN INPUT:input在某些拦截器会使用 NONE 配置逻辑视图:struts_demo2.xml,配置后出现错误信 ...
- 【剑指Offer面试编程题】题目1507:不用加减乘除做加法--九度OJ
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=10 ...
- 理解错误的 Arrays.asList()
简介 Arrays.asList() 作用是将一个数组转换为一个List 集合. String[] myArray = { "Apple", "Banana", ...
- python中numpy.concatenate()函数的使用
numpy库数组拼接np.concatenate 原文:https://blog.csdn.net/zyl1042635242/article/details/43162031 思路:numpy提供了 ...