题目: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 还可以整除这个区块的长度的话

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

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. string a;
  4. int a0,qnext[1000001];
  5. void hnext(string o,int o0){//next数组
  6. int j=0,k=-1;
  7. qnext[j]=k;
  8. while(j<o0){
  9. if(k==-1||o[j]==o[k]){
  10. qnext[++j]=++k;
  11. }
  12. else{
  13. k=qnext[k];
  14. }
  15. }
  16. }
  17. int main(){
  18. while(1){
  19. cin>>a;
  20. if(a=="."){
  21. return 0;
  22. }
  23. a0=a.size();
  24. hnext(a,a0);
  25. if(a0%(a0-qnext[a0])==0){//能整除
  26. printf("%d\n",a0/(a0-qnext[a0]));
  27. //白给
  28. }
  29. else{//不能
  30. printf("1\n");
  31. //中间被某个B区块拦路了
  32. //直接出1就得了
  33. }
  34. }
  35. return 0;
  36. }

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

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

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. Elemnt ui 组件封装(form)

    <template> <el-form class="form" :inline="formConfig.inline" :model=&qu ...

  2. WPF样式和触发器

    理解样式 样式可以定义通用的格式化特征集合. Style 类的属性 Setters.Triggers.Resources.BasedOn.TargetType <Style x:Key=&quo ...

  3. Mybatis执行多条SQL

    1:在数据库连接配置文件处,增加如下参数即可:allowMultiQueries=true spring: datasource: url: jdbc:mysql://IP:PORT/数据库名?其他参 ...

  4. 使用Typora + 阿里云OSS + PicGo 打造自己的图床

    使用Typora + 阿里云OSS + PicGo 打造自己的图床 为什么要打造图床? 让笔记远走高飞 试问以下场景: 我们要把 markdown 笔记放到某博客上,直接进行复制即可.但因你的图片存储 ...

  5. 2.SSH协议常见问题排错

    一.SSH登录linux服务器密码验证很慢 现象:ssh登录服务器后,输入密码时,验证要等10秒左右,很慢.登录上去后速度正常,这种情况主要有两种可能的原因: 1. DNS反向解析的问题 OpenSS ...

  6. 常问的MySQL面试题集合

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 ...

  7. Docker的三种网络代理配置

    开源Linux 长按二维码加关注~ 上一篇:IPv6技术白皮书(附PDF下载) 有时因为网络原因,比如公司NAT,或其它啥的,需要使用代理.Docker的代理配置,略显复杂,因为有三种场景.但基本原理 ...

  8. 爬虫--Scrapy框架的初步使用

    1.scrapy在windows环境下安装 - 环境的安装: a. pip3 install wheel b. 下载twisted: http://www.lfd.uci.edu/~gohlke/py ...

  9. 试驾 Citus 11.0 beta

    https://www.citusdata.com/blog/2022/03/26/test-drive-citus-11-beta-for-postgres/ Citus 11.0 beta 的最大 ...

  10. HMS Core使能AI智慧体验,共建创新应用生态

    5月17日,2022年搜狐科技峰会成功举办,峰会汇聚各界大咖,共同探讨AI 技术的深入应用以及行业数字化的发展趋势.华为终端云服务应用生态BU总裁望岳发表题为<使能AI智慧体验,共建创新应用生态 ...