题目:http://ybt.ssoier.cn:8088/problem_show.php?pid=1466

题目思路:不知道大家在KMP算法里有没有看见这么个句子

while(j<len)

这是找next数组的时候的游标范围

这说明 j 总有走到 len-1 的时候

但是这也说明了一个问题,next[len] 是一定有值的

要么 a[k]==a[j],要么就是 k 走到了-1

而我们今天要做的题就与这个被赋值的 next[len] 有关系

(注意:以下的两种情况都默认 j=len-1)

首先,如果是 k 走到了-1 这种情况

那next[len]会得零,这他妈跟没赋值有什么区别吗

接下来顺着另一种思路剖析

当 a[k]==a[j] 的时候可能会是

ACA

k    j

或者

AABAABAAB

k     j

。。。。。。数不过来

但是它也有规律可循

这边以X,Y,Z这三个大写字母为字符区块来推导

发现,k 永远是会离 j 所在的区块最近的一个相同区块的最后一个

比如

X X X Y X

此时的 k 会在第三个区块的最后一个

这是可以与 j 呼应上的

或者

Y Y Y Y

此时的 k 就会在第三个区块的最后一个字符上

接下来就是重点了

next[j] 是等于 k 的

并且由于区块相同

我是可以得到从 k+1~len-1 的这块,也就是最后一块区块的长度的

如果这种时候 len 还可以整除这个区块的长度的话

那不就是等于说:“嘿,前面的东西我都对应好了,你放心大胆的用!”

循环节以及循环节的个数,全部白给

#include<bits/stdc++.h>
using namespace std;
string a;
int a0,qnext[1000001];
void hnext(string o,int o0){//next数组
int j=0,k=-1;
qnext[j]=k;
while(j<o0){
if(k==-1||o[j]==o[k]){
qnext[++j]=++k;
}
else{
k=qnext[k];
}
}
}
int main(){
while(1){
cin>>a;
if(a=="."){
return 0;
}
a0=a.size();
hnext(a,a0);
if(a0%(a0-qnext[a0])==0){//能整除
printf("%d\n",a0/(a0-qnext[a0]));
//白给
}
else{//不能
printf("1\n");
//中间被某个B区块拦路了
//直接出1就得了
}
}
return 0;
}


题目总结:这题的关键在于找到可能的循环节的长度

对某些模板程序探索一下会有意想不到的惊喜

017(Power Strings二刷)(KMP)的更多相关文章

  1. Power Strings (poj 2406 KMP)

    Language: Default Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33205   ...

  2. poj 2406 Power Strings (后缀数组 || KMP)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 28859   Accepted: 12045 D ...

  3. (简单) POJ 2406 Power Strings,扩展KMP。

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

  4. POJ 2406 Power Strings (KMP)

    Power Strings Time Limit: 3000MSMemory Limit: 65536K Total Submissions: 29663Accepted: 12387 Descrip ...

  5. poj 2406:Power Strings(KMP算法,next[]数组的理解)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 30069   Accepted: 12553 D ...

  6. poj 2406 Power Strings kmp算法

    点击打开链接 Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27368   Accepted:  ...

  7. 【POJ2406】 Power Strings (KMP)

    Power Strings Description Given two strings a and b we define a*b to be their concatenation. For exa ...

  8. poj2406 Power Strings(kmp失配函数)

    Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 39291 Accepted: 16315 Descr ...

  9. Power Strings(kmp妙解)

    Power Strings Time Limit : 6000/3000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tota ...

随机推荐

  1. 得到知识服务app原型设计比较与实践

    一.几种原型设计工具的比较 墨刀 优点: 拥有PC端.手机端.网页版,让你随时随地可以进行产品原型设计: 其定位是主要用于设计移动APP原型,其控件的拖拉.大小的调整,都会自然去匹配相应的母版大小,非 ...

  2. 攻防世界-MISC:神奇的Modbus

    这是攻防世界高手进阶区的第三题,题目如下: 点击下载附件一,得到一个流量包,题目中提到的modbus,百度百科的解释如下: 用wireshark打开流量包,搜索modbus 然后鼠标右键选择追踪流,再 ...

  3. [笔记] K-D Tree

    一种可以 高效处理 \(k\) 维空间信息 的数据结构. 在正确使用的情况下,复杂度为 \(O(n^{1-\frac{1}{k}})\). K-D Tree 的实现 建树 随机一维选择最中间的点为当前 ...

  4. 使用grabit分析mysql数据库中的数据血缘关系

    使用grabit分析mysql数据库中的数据血缘关系 Grabit 是一个辅助工具,用于从数据库.GitHub 等修订系统.bitbucket 和文件系统等各种来源收集 SQL 脚本和存储过程,然后将 ...

  5. 从0到1使用kubebuiler开发operator

    介绍 假设一个Nginx的QPS(服务器一秒内处理的请求数)上限为500,如果外部访问的QPS达到了600,为了保证服务质量,必须扩容一个Nginx来分摊请求. 在Kubernetes环境中,如果外部 ...

  6. 137_Power BI 自定义矩阵复刻Beyondsoft Calendar

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 前两天我们用PBI原生的视觉制作了自定义的热力图,今天我们来复刻一个Beyondsoft Calendar 1. ...

  7. Javabean使用实例

    1.login.jsp <%@ page language="java" contentType="text/html; charset=utf-8" p ...

  8. Hibernate基础入门2

    HQL与Criteria HQL(Hibernate Query Language)-官方推荐面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写 ...

  9. UNION 与 UNION ALL 的区别

    UNION:合并查询结果,并去掉重复的行. UNION ALL:合并查询结果,保留重复的行. 举例验证说明: 创建两个表:user_info 和 user_info_b,设置联合主键约束,联合主键的列 ...

  10. Java泛型知识总结

    泛型 前言 在没有泛型之前,程序员必须使用Object编写适用于多种类型的代码.很繁琐,也不安全. 泛型的引入使Java有了一个很强的类型系统,允许设计者详细地描述变量和方法的类型要如何变化. 在普通 ...