「UVA1328」「POJ1961」 Period 解题报告
UVA1328 Period
其他链接:luogu UVA1328 POJ1961
For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (\(2 \le i \le N\))we want to know the largest \(K > 1\) (if there is one) such that the prefix of \(S\) with length i can be written as \(A^K\), that is A concatenated K times, for some string A. Of course, we also want to know the period K.
Input
The input file consists of several test cases. Each test case consists of two lines. The first one contains \(N\) (\(2 \le N \le 1000000\)) the size of the string \(S\). The second line contains the string S. The input file ends with a line, having the number zero on it.
Output
For each test case, output ‘Test case #’ and the consecutive test case number on a single line; then, for each prefix with length i that has a period K > 1, output the prefix size i and the period K separated by a single space; the prefix sizes must be in increasing order. Print a blank line after each test case.
Sample Input
3
aaa
12
aabaabaabaab
0
Sample Output
Test case #1
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4
翻译
(louhc自己翻译的啦 luogu ID Sinner也是我)
题意描述
对于给定字符串S的每个前缀,我们想知道它是否为周期串。也就还是说,它是否为某一字符串重复连接而成(必须至少重复2次)(即循环节)。
输入
多组数据。每组数据,第一行一个数字表示长度,第二行一个字符串S。
输出
输出前缀长度与循环节数量。
说明
字符串长度不超过1000000,仅由小写字母组成。
对于每个前缀,只要输出长度最小的循环节
写在前面
Substr(i, j)表示s的子串s[i~j]
这里s的下标从1开始
i的上一个匹配:一个位置j,满足Substr(1, j) == Substr(i - j + 1,N)
下面黑线表示字符串,其中红框中包含的字符相等(这是自然,同一个字符串嘛)。
j还要满足
(注意啦 两条黑线表示同一个字符串,只是位置不同)
(其实这也算是KMP的复习吧。。。)
下面图中红框中都表示相同
算法
KMP。由于这不是KMP学习笔记,不仔细讲,请先学会KMP。
思路
这题也可算是“拍大腿”系列了吧?其实你看看下面代码,真的很简单,关键就是如何推出这个结论。
(我不用next,用了f做数组名,希望大家不要看不习惯,意思是一样的)

粉色部分也表示相同。这很明显,因为字符是一一对应的嘛(同一个字符串位置相同、长度相同的字符串当然一样)。
由于红框内完全相同,还可以——

继续对应!灰线表示在原字符串中是对应的。
还可以对应!

可能就会出现这样的情况!(当然可能最前面不够长度)
因此,只要f[i]>0,i前面肯定有循环节!(只不过不知道是否完整,bb|abb|abb|abb这样也看作是)而且循环节长度为i - f[i] + 1!。因此只要判断循环节长度能否将长度整除即可。具体请见代码(真的短)。
代码
#include<cstdio>
using namespace std;
#define MAXN 1000005
int N, T;
char s[MAXN];
int f[MAXN];
int main(){
while( ~scanf( "%d", &N ) && N ){
scanf( "%s", s + 1 ); T++;
printf( "Test case #%d\n", T );
int t(0); f[1] = 0;
for ( int i = 2; i <= N; ++i ){
while ( s[i] != s[t + 1] && t ) t = f[t];
if ( s[i] == s[t + 1] ) t++;
f[i] = t;
if ( f[i] != 0 && i % ( i - f[i] ) == 0 ) printf( "%d %d\n", i, i / ( i - f[i] ) );
}
putchar('\n');
}
return 0;
}
「UVA1328」「POJ1961」 Period 解题报告的更多相关文章
- 「UVA1328」Period 解题报告
English题面 题意: 给你一个长度为n的字符串,依次取字符串前i个(前缀),如果前缀由k(k>0)个相同真子串构成,那么输出i和k 直到n为0结束,每组数据后要有一行空白 思路: KMP+ ...
- 「NOI2013」小 Q 的修炼 解题报告
「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...
- 「SDOI2017」树点涂色 解题报告
「SDOI2017」树点涂色 我sb的不行了 其实一开始有一个类似动态dp的想法 每个点维护到lct树上到最浅点的颜色段数,然后维护一个\(mx_{0,1}\)也就是是否用虚儿子的最大颜色 用个set ...
- 「SCOI2015」小凸想跑步 解题报告
「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...
- 「SCOI2015」小凸解密码 解题报告
「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...
- 「SCOI2015」小凸玩矩阵 解题报告
「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...
- 「SCOI2015」小凸玩密室 解题报告
「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...
- 「SCOI2014」方伯伯运椰子 解题报告
「SCOI2014」方伯伯运椰子 可以看出是分数规划 然后我们可以看出其实只需要改变1的流量就可以了,因为每次改变要保证流量守恒,必须流成一个环,在正负性确定的情况下,变几次是无所谓的. 然后按照套路 ...
- 「SCOI2014」方伯伯的 OJ 解题报告
「SCOI2014」方伯伯的 OJ 和列队有点像,平衡树点分裂维护即可 但是需要额外用个set之类的对编号查找点的位置 插入完了后记得splay,删除时注意特判好多东西 Code: #include ...
随机推荐
- SSH基本原理
SSH原理与运用:远程登录 作者: 阮一峰 年12月21日 SSH是每一台Linux电脑的标准配置. 随着Linux设备从电脑逐渐扩展到手机.外设和家用电器,SSH的使用范围也越来越广.不仅程序员离不 ...
- 阿里云应用实时监控 ARMS 再升级,支持 Prometheus 开源生态
摘要: 应用实时监控服务 (ARMS) 是一款APM类的监控产品. 用户可基于 ARMS 的前端.应用.自定义监控,快速构建实时的应用性能和业务监控能力.ARMS 让所有性能问题“一屏了然”,不遗余力 ...
- pytorch之expand,gather,squeeze,sum,contiguous,softmax,max,argmax
目录 gather squeeze expand sum contiguous softmax max argmax gather torch.gather(input,dim,index,out=N ...
- java super关键字和调用父类构造方法
表示父类对象的默认引用 如果子类要调用父类被覆盖的实例方法,可用super作为调用者调用父类被覆盖的实例方法. 使用super调用父类方法 使用super调用父类的构造方法 调用构造方法 本类中调用另 ...
- vscode编辑如何保存时自动校准eslint规范
在日常开发中,一个大点的项目会有多人参与,那么可能就会出现大家的代码风格不一,各显神通,这个时候就要祭出我们的eslint. 在这之前磨刀不误砍柴工,我们先来配置一下我们的代码编辑工具,如何在vsco ...
- java throw
自行抛出一个异常对象,抛出异常类的对象: 若throw抛出的是Runtime异常: 程序可以显示使用try...catch来捕获并处理,也可以不管,直接交给方法调用者处理: 若throw抛出Check ...
- Vue的第一个实例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- UVa 1374 - Power Calculus——[迭代加深搜索、快速幂]
解题思路: 这是一道以快速幂计算为原理的题,实际上也属于求最短路径的题目类型.那么我们可以以当前求出的幂的集合为状态,采用IDA*方法即可求解.问题的关键在于如何剪枝效率更高.笔者采用的剪枝方法是: ...
- dotnet 动态代理魔法书
看到标题的小伙伴是不是想知道什么是魔法书,如果你需要写一段代码,这段代码是在做神奇的业务,只有你查询到了魔法书你才能找到这个对象,同时你还需要实现自己的接口,通过自己实现的接口调用才能用到有趣的方法 ...
- Jmeter配置元件——CSV DataSet Config参数化
在聊CSV DataSet Config配置元件前,先来讨论下为何要参数化? 比如在做性能测试过程中, 一般我们需要模拟多个用户进行操作, 为了满足实际场景, 模拟真实的用户行为, 我们需要做到模拟的 ...

