Period
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6233 Accepted Submission(s): 3015
aaa
12
aabaabaabaab
0
2 2
3 3
Test case #2
2 2
6 2
9 3
12 4
总结一下,如果对于next数组中的 i, 符合 i % ( i - next[i] ) == 0 && next[i] != 0 , 则说明字符串0-n-1循环,而且
循环节长度为: i - next[i]
循环次数为: i / ( i - next[i] )
如果要问为什么可以自习用几个栗子,然后啃一啃
或者看这里:
next[i]数组的含义是0-i-1个字符中前next[i]和倒数next[i]是完全相同的,那么如果next[i] < (i-1)/2 (即如果这完全相同的前缀和后缀不重合的话)那么有i-next[i]>(i-1)/2则i不可能有i%[i-next[i]]==0这种情况是不可能有循环串的,因为如果是循环串,公共的前缀和后缀肯定是重合的
/*
对next的理解更深入了点儿。
字符编号从0开始,那么if(i%(i-next[i])==0),注意,还要保证循环次数大于1,则i前面的
串为一个轮回串,其中轮回子串出现i/(i-next[i])次。
还要注意Next数组处理的是当前这个数的前缀,所以要处理最后一个字符就要再有面再加一位防止漏解
Print a blank line after each test case.注意这个pe了一次
*/ #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = ;
char b[N];
int Next[N];
void get_next(int n)
{
for(int i = ; i <= n; i++) Next[i]=;
int tm;
tm = Next[] = -;
int j = ;
while(j<n){
if(tm<||b[j]==b[tm]) {
Next[++j] = ++tm;
}
else tm = Next[tm];
}
return;
}
int main()
{
int c = ;
int n;
while(~scanf("%d",&n),n)
{
getchar();
scanf("%s",b);
b[n] = '#';
get_next(n);
printf("Test case #%d\n",c++);
for(int i = ; i <= n; i++){
int t = i - Next[i];
if(i%t==&&i/t>){
printf("%d %d\n",i,i/(i-Next[i]));
}
}
printf("\n");
}
return ;
}
hdu_1358Period(kmp找循环前缀)的更多相关文章
-
POJ:2185-Milking Grid(KMP找矩阵循环节)
Milking Grid Time Limit: 3000MS Memory Limit: 65536K Description Every morning when they are milked, ...
-
HDU 2802 F(N)(简单题,找循环解)
题目链接 F(N) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
-
HDU 3746 Cyclic Nacklace (KMP求循环节问题)
<题目链接> 题目大意: 给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数. [>>>kmp next函数 kmp的周期问题] #include &l ...
-
codeforces 825F F. String Compression dp+kmp找字符串的最小循环节
/** 题目:F. String Compression 链接:http://codeforces.com/problemset/problem/825/F 题意:压缩字符串后求最小长度. 思路: d ...
-
(收藏)KMP算法的前缀next数组最通俗的解释
我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...
-
POJ 2752 Seek the Name, Seek the Fame kmp(后缀与前缀)
题意: 给你一个串T,找出串T的子串,该串既是T的前缀也是T的后缀.从小到大输出所有符合要求的串的长度. 分析: 首先要知道KMP的next[i]数组求得的数值就是串T中的[1,i-1]的后缀与串T中 ...
-
HDU 3746 Cyclic Nacklace (KMP找循环节)
题目链接:HDU 3746 Sample Input 3 aaa abca abcde Sample Output 0 2 5 Author possessor WC Source HDU 3rd & ...
-
bzoj 4974 [Lydsy1708月赛]字符串大师 KMP 最小循环元 构造
LINK:字符串大师 给出一个字符串的每个前缀的最小循环元 还原字典序最小的原字符串. 一个比较显然的结论 或者说 学过KMP的都知道 对于每个前缀i求出nex数组后 那么i-nex[i]为最小循环元 ...
-
HDOJ-3746(KMP+最小循环结)
Cyclic Nacklace HDOJ-3746 本题还是使用KMP算法,需要使用到前缀数组 利用前缀数组计算最小循环节:即t=n-pi[n-1]. 最后输出还需要的珠子,当然还有判断什么时候输出为 ...
随机推荐
-
vertx简单客户端创建
import java.util.HashMap;import java.util.Map; import com.yunva.vertx.test.vertproject.util.JsonUtil ...
-
DrClient 校园网客户端破解
好吧..详细点.这个功能就是破解学校的限制 让你开无线网共享给手机的时候 不会被断网 提示有代理软件..这样帮你电脑省好多流量.平板电脑也是 软件叫Process Explorer 不大 1M多 自己 ...
-
poj2540Hotter Colder(半平面交)
链接 根据距离可以列得直线方程,附上初始矩形的四个顶点,依次用直线切割. #include<iostream> #include <stdio.h> #include < ...
-
UVA 531 - Compromise(dp + LCS打印路径)
Compromise In a few months the European Currency Union will become a reality. However, to join th ...
-
诡异的 &;quot;password取回&;quot; 邮件问题
大部分系统中都有"找回password"的功能,我们的平台也做了此功能,用户可通过 短信,邮件 找回password. 当中对于邮件找回password的方式遇到奇特的问题.记录下 ...
-
半透明边框与background-clip
在开始本章之前,我们要先简单介绍CSS中的半透明颜色.自2009年后,网页工作者们开始使用半透明颜色,如rgba().hsla().前者相信大家都很熟悉,不难理解其中将有四个参数,第四个参数则为透明度 ...
-
Python函数二(函数名,闭包,迭代器)之杵臼之交
函数名的使用: 函数名可以作为值,赋值给变量. 函数名可以作为参数传参给函数. 函数名可以作为返回值. 函数名可以作为元素存储在容器里. 闭包:在嵌套函数内,使用外层局部变量(非全局变量)就是一个闭包 ...
-
编译jmeter5.0源码
jmeter5.0使用过程中,遇到request或者response乱码的情况,想要一次性解决这个问题,需要编译ApacheJMeter_http.jar这个包(lib\ext文件下)里的Reques ...
-
input file 多张图片上传 获取地址 ——fileReader
//上传图片 $('#files').change(function(e){ var fil = this.files; var m =0; if(fil.length>3){ alert('重 ...
-
H5与Native交互之JSBridge技术
一.原理篇 下面分别介绍IOS和Android与Javascript的底层交互原理 IOS 在讲解原理之前,首先来了解下iOS的UIWebView组件,先来看一下苹果官方的介绍: You can us ...