题目链接:http://vjudge.net/problem/viewProblem.action?id=29342

题目大意:给定字符串,找到每个前缀的最大循环节的个数。

首先当然是kmp预处理,接下来的问题是 怎么找循环节?

用反证法可以证明,如果f[i]~i之间的字符串能构成循环节,则该字符串就是i前缀对应的循环节,否则循环节不存在。

对每个前缀找到尾指针对应的失陪位置后,不需要按失陪指针继续往前寻找了(否则超时)。

只用判断上个位置到尾部的字符串是否是循环节(长度是否有整除关系),即知循环节个数。

代码奉上:

 #include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <cstring> int f[];
char p[];
void deal(int l){
f[]=-;
int i=,k=-;
while(i<l){
if(k==- || p[k]==p[i])f[++i]=++k;
else k=f[k];
}
//for(i=0;i<l;i++)printf("%d: %d\n",i,f[i]);
}
int main(){
int n,cs=;
while(scanf("%d",&n) && n){
scanf("%s",p);
deal(n);
printf("Test case #%d\n",cs++);
int i,k;
for(i=;i<=n;i++){
if(f[i]== || i%(i-f[i]))continue;
k=i/(i-f[i]);
if(k>)printf("%d %d\n",i,k);
}
printf("\n"); }
return ;
}
证明没有仔细说,不明白的欢迎留言讨论~

uvalive3026 Period (KMP+结论)的更多相关文章

  1. POJ 1961 Period( KMP )*

    Period Time Limit: 3000MSMemory Limit: 30000K Total Submissions: 12089Accepted: 5656 Description For ...

  2. hdu oj Period (kmp的应用)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. hdu 1358 period KMP入门

    Period 题意:一个长为N (2 <= N <= 1 000 000) 的字符串,问前缀串长度为k(k > 1)是否是一个周期串,即k = A...A;若是则按k从小到大的顺序输 ...

  4. LA3026 - Period(KMP)

    For each prefix of a given string S with N characters (each character has an ASCII code between 97 a ...

  5. poj1961 Period kmp解决找字符串的最小循环节

    /** 题目:poj1961 Period 链接:http://poj.org/problem?id=1961 题意:求从1到i这个前缀(2<=i<=N) ,如果有循环节(不能自身单独一个 ...

  6. HDU1358 Period —— KMP 最小循环节

    题目链接:https://vjudge.net/problem/HDU-1358 Period Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  7. hdu 1358 Period(KMP入门题)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  8. HDU 1358 Period(KMP next数组运用)

    Period Problem Description For each prefix of a given string S with N characters (each character has ...

  9. UVA 1328 - Period KMP

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36131 题意:给出一个长度为n的字符串,要求找到一些i,满足说从1 ...

随机推荐

  1. mysql explain 解释

     就是10W记录比如全表返回1行  Mysql显示可能是10W oracle是1行   mysql 是预估需要扫描的记录 Oracle 是预估返回的记录

  2. kafka-简单事例

    开始创建项目,这里所用的工程结构是maven. 在pox.xml中添加kafka的依赖包,如下所示: <dependency> <groupId>org.apache.kafk ...

  3. 2013=10=19 ENGLISH 翻译

    数据结构习题及答案 严蔚敏_课后习题答案 http://www.doc88.com/p-243584884293.html 273089354 随着女性获得平等权力的趋势,女性日渐增长的经济权力以及为 ...

  4. The Minimum Length - HUST 1010(求最小循环节)

    题意:有个一字符串A(本身不是循环串),然后经过很多次自增变成AAAAA,然后呢从自增串里面切出来一部分串B,用这个串B求出来A的长度.   分析:其实就是求最小循环节.......串的长度 - 最大 ...

  5. 个人整理--Java编码规范

    编码规范对于开发人员来说是非常重要的,有以下几个原因: 1.一个软件的生命周期中,80%的花费在于维护 2.几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 3.编码规范可以改善软件 ...

  6. windows下计算文件的md和sha值

    在windows下可以使用FCIV命令行工具计算文件的md5和sha值,具体例子如下: FCIV -md5 -sha1 path\filename.ext 例如: FCIV-md5-sha1 c:\w ...

  7. 移动端转PC --> PC跳转移动端

    <script type=”text/javascript”>try {var urlhash = window.location.hash;if (!urlhash.match(“fro ...

  8. AS3 读写 C++ 64位数字

    为框架添加了一套新的与C++通讯的数据协议,其中和C++的大爷们对于他们的64位数字(unsigned long long)读写的问题纠结了很久.真心觉得“学好C++走遍天下都不怕啊” AS里Numb ...

  9. Json序列化、反序列化互换

    // 序列化 using (MemoryStream stream = new MemoryStream()) { serializer.WriteObject(stream, hdm); jsonT ...

  10. 辛星浅析跨域传输的CORS解决方式

    首先我们有一个概念.那就是"同源准则",也就是same-origin  policy,它要求一个站点(协议+主机+port号)来确定的脚本.XMLHttpRequest和Webso ...