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 解题报告的更多相关文章

  1. 「UVA1328」Period 解题报告

    English题面 题意: 给你一个长度为n的字符串,依次取字符串前i个(前缀),如果前缀由k(k>0)个相同真子串构成,那么输出i和k 直到n为0结束,每组数据后要有一行空白 思路: KMP+ ...

  2. 「NOI2013」小 Q 的修炼 解题报告

    「NOI2013」小 Q 的修炼 第一次完整的做出一个提答,花了半个晚上+一个上午+半个下午 总体来说太慢了 对于此题,我认为的难点是观察数据并猜测性质和读入操作 我隔一会就思考这个sb字符串读起来怎 ...

  3. 「SDOI2017」树点涂色 解题报告

    「SDOI2017」树点涂色 我sb的不行了 其实一开始有一个类似动态dp的想法 每个点维护到lct树上到最浅点的颜色段数,然后维护一个\(mx_{0,1}\)也就是是否用虚儿子的最大颜色 用个set ...

  4. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  5. 「SCOI2015」小凸解密码 解题报告

    「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...

  6. 「SCOI2015」小凸玩矩阵 解题报告

    「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...

  7. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  8. 「SCOI2014」方伯伯运椰子 解题报告

    「SCOI2014」方伯伯运椰子 可以看出是分数规划 然后我们可以看出其实只需要改变1的流量就可以了,因为每次改变要保证流量守恒,必须流成一个环,在正负性确定的情况下,变几次是无所谓的. 然后按照套路 ...

  9. 「SCOI2014」方伯伯的 OJ 解题报告

    「SCOI2014」方伯伯的 OJ 和列队有点像,平衡树点分裂维护即可 但是需要额外用个set之类的对编号查找点的位置 插入完了后记得splay,删除时注意特判好多东西 Code: #include ...

随机推荐

  1. bert 硬件要求

    https://github.com/google-research/bert BERT ***** New May 31st, 2019: Whole Word Masking Models *** ...

  2. Android教程 -04 启动其它Activity,静态工厂设计模式传递数据

    视频建议采用超清模式观看, 欢迎点击订阅我的优酷 意图 Intent 一个应用程序肯定不只有一个界面,如何切换到其它界面,只时候就需要启动其它的Activity.启动Activity有多种方式.我在这 ...

  3. 神经网络入门——7or 感知器

    OR 感知器 OR 感知器与 AND 感知器很类似,在下图中,OR 感知器与 AND 感知器有相同的分割线,只是 OR 感知器分割线下移了一段距离.对权重或者偏置做怎样的设置可以实现这个效果?用下面的 ...

  4. SuperSocket获取会话的连接和断开事件

    关键字: 连接事件, 断开事件, OnSessionStarted,OnSessionClosed, NewSessionConnected, SessionClosed AppSession 的虚方 ...

  5. JS 动态表格

    表格 在script里面使用innerHTML获取标签体的内容,然后进行添加. 删除则是不断的获取父节点,利用父节点删除子节点. 在做这个的时候,要主要获取表格table的对象有两种方式,一是getE ...

  6. Python--day62--ORM的使用

    4.Django里ORM的使用 1,手动创建数据库 2,在settings.py里面,配置数据库的连接信息 3,在项目/__init__.py告诉Django用pymysql模块代替MySQLdb(不 ...

  7. H3C 静态路由配置示例

  8. jQuery 工具类函数-检测对象是否为原始对象

    调用名为$.isPlainObject的工具函数,能检测对象是否为通过{}或new Object()关键字创建的原始对象,如果是,返回true,否则,返回false值,调用格式为: $.isPlain ...

  9. 文本框(代替input)输入长度限制、提示

    <div class="inform_content_text"> <textarea name="name" placeholder=&qu ...

  10. vue-learning:20 - js - 区别:filters / data / computed / watch / methods

    区别:filters / data / computed / watch / methods 在配置对象options中,filters/data/computed/watch/methods的每一项 ...