今天下午刚好看了一道最小循环节的题,感觉还是挺有意思的,不过自己还是看了一个下午才理解点,感觉自己好菜哎~~~

kmp算法里的next数组还有一个性质就是j-next[j]是s2的最小循环节
稍微修改下next数组的定义,这里是修改前的定义链接,我们不再要求s2[j]和s2[k]不同,我们仅需要去掉if语句,直接令s2[j] = k;修改后代码如下

void getNext()
{int k,j;k = -1;j = 0;next[j] = -1;while(s2[j] != '\0'){while(k != -1 &&s2[j] != s2[k])k = s2[k];next[++j] = ++k;//修改部分 }return ;} 

需要注意几点:
1:j-next[j]是最小循环节的长度
2:字符串的循环条件是j%(j-next[j])==0&&next[j]!=0
3:最小循环节的循环次数是j/(j-next[j])

具体的程序运行过程如下面这张图,代码在末尾我输入的字符串ababa进行测试,如果看了图还不太清楚的小伙伴可以把代码拷下去自己运行一遍,大概就了解了,实在不清楚的话,可以手动推一遍(kmp手动模拟三遍的路过)

#include<stdio.h>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char s1[1000];
int next[1000];
int l;
void getNext(char s1[],int next[])
{int i,j;j = -1;i = 0;next[i] = -1;while(s1[i]!='\0'){while(j!=-1&&s1[j]!=s1[i])j = next[j];i++;j++;next[i] = j;}return;
}
int main()
{int t,i,ans;while(scanf("%s",s1)!=EOF){getNext(s1,next);l = ans = strlen(s1);i = next[l];while(i != -1){int k = l - i;//最小循环节 int p = l%k;//循环k节点若干次后剩余部分的长度int q = (k-p)%k;//q为字符串s1要想补齐成恰好整数个k所需要的最少字符数 if( l+q >= k*2)//判断循环是否超过两次ans = min(ans,p);i = next[i];}printf("%d\n",ans);//输出最小补全长度 }return 0;
}

转载于:https://www.cnblogs.com/hellocheng/p/7350066.html

【字符串】【KMP模板--最小循环节总结】相关推荐

  1. 【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)

    题干: CC always becomes very depressed at the end of this month, he has checked his credit card yester ...

  2. kmp求最小循环节及最小循环周期

    只列出求最小循环节部分 for(int i=1;i<=n;i++){int temp=i-next[i];if(i%temp==0 && i/temp>1)printf(& ...

  3. 嫦娥奔月(KMP,找循环节)及其扩展KMP

    问题描述 <归妹>卦辞为:昔者恒我(姮娥)窃毋死之药于西王母,服之以(奔)月.将往,而枚占于有黄.有黄占之曰:"吉.翩翩归妹,独将西行.逢天晦芒,毋惊毋恐,后且大昌". ...

  4. Uvalive - 3026 Period (kmp求字符串的最小循环节+最大重复次数)

    参考:http://www.cnblogs.com/jackge/archive/2013/01/05/2846006.html 总结一下,如果对于next数组中的 i, 符合 i % ( i - n ...

  5. MUV LUV EXTRA -( kmp最小循环节 )

    题目链接:点击进入 题意 一个无限循环小数( 从小数点后 某一位 开始依次不断地重复出现前一个或一节数字的十进制无限小数,叫做循环小数 ),真实价值 = a * p - b * l ( a , b 是 ...

  6. 2019 CCPC秦皇岛 J 题 MUV LUV EXTRA【KMP 求最小循环节】

    题意: 原题意是给出一个有理数的前一部分,求这个有理数的无限循环部分是什么.有一个值来评估猜的准确度.转换一下就成了下面的题意: 给出一个字符串s,有某一个子串,设p为该子串在s的某个后缀中的匹配长度 ...

  7. 【POJ - 2406】Power Strings (KMP,最小循环节)

    题干: Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc ...

  8. 周期(KMP找最小循环节)

    Description: 一个字符串的前缀是从第一个字符开始的连续若干个字符,例如"abaab"共有5个前缀,分别是a, ab, aba, abaa, abaab. 我们希望知道一 ...

  9. Problem A. MUV LUV EXTRA(kmp求最小循环节)

    LINK 最小化 a ∗ p − b ∗ l a*p-b*l a∗p−b∗l 其中 p p p表示循环节总长, l l l表示循环节长度 若循环节从 i i i位置开始,那么一定需要延续到末尾 考虑固 ...

  10. 【文文殿下】浅谈KMP算法next数组与循环节的关系

    KMP算法 KMP算法是一种字符串匹配算法,他可以在O(n+m)的时间内求出一个模式串在另一个模式串下出现的次数. KMP算法是利用next数组进行自匹配,然后来进行匹配的. Next数组 Next数 ...

最新文章

  1. linux shell中 if else以及大于、小于、等于逻辑表达式介绍
  2. java 对象读写_java 对象输入输出流读写文件的操作实例
  3. Spring Security构建Rest服务-1400-授权
  4. IDE:5个最喜欢的NetBeans功能
  5. java接收json字符串_JAVA后台接收前台传过来的json字符串并解析获得key 和value
  6. 12306的问题是技术难题吗
  7. druid监控页面 关闭_druid-springboot-starter默认启用监控页面,公网项目可能外泄DB信息...
  8. win10电脑插耳机没反应(win10插上耳机还外放)
  9. 《Python之禅》的翻译和解释
  10. TypeScript实战-04-TS枚举类型
  11. EditText getText
  12. 基于区块链的电子档案及其流转管理系统
  13. 台式计算机显示连接不可用,电脑莫名其妙无法上网提示“连接不可用”如何解决...
  14. 笔记本电脑卡顿怎么办?教你一键重装系统让电脑“复活”
  15. java 异常 不抛_java中的不抛出的异常是什么
  16. 索尼电脑安装linux,Sony Vaio P 安装Ubuntu Netbook Remix
  17. vue实现星级评价及上传多张图片等功能(类似淘宝商品评价页面)
  18. 【第4组】Touch组需求分析总文档 V7.0 2017/7/13
  19. 牛顿和莱布尼茨这两个冤家的共同烦恼
  20. MIT线性代数:6.列空间和零向量

热门文章

  1. wordpress插件WP Rest API接口文档说明
  2. Linux chapter 6
  3. Docker 安装 Java Jdk 8、安装 Vim 编辑器
  4. Spring JdbcTemplate 模板剖析 之 常用 增删改查
  5. Java 设计模式 之 模板方法模式(Template Method)
  6. Docker 概述 与 CentOS 上安装、卸载、启动
  7. 小D课堂 - 新版本微服务springcloud+Docker教程_4-02 微服务调用方式之ribbon实战 订单调用商品服务...
  8. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_01 File类_7_File类创建删除功能的方法...
  9. java day12第十二课 泛型和枚举
  10. AC日记——幸运号码 51nod 1043