KMP算法:

一:next数组:next[i]就是前面长度为i的字符串前缀和后缀相等的最大长度,也即索引为i的字符失配时的前缀函数。

二:KMP模板

  1. /*
  2. pku3461(Oulipo), hdu1711(Number Sequence)
  3. 这个模板 字符串是从0开始的
  4. Next数组是从1开始的
  5. */
  6. #include <iostream>
  7. #include <cstring>
  8. using namespace std;
  9.  
  10. const int maxn = ;
  11. int _next[maxn];
  12. char S[maxn], T[maxn];
  13. int slen, tlen;
  14.  
  15. void getNext()
  16. {
  17. int j, k;
  18. j = ; k = -; _next[] = -;
  19. while(j < tlen)
  20. if(k == - || T[j] == T[k])
  21. _next[++j] = ++k;
  22. else
  23. k = _next[k];
  24. }
  25.  
  26. /*
  27. }
  28. 返回模式串T在主串S中首次出现的位置
  29. 返回的位置是从0开始的。
  30. */
  31. int KMP_Index()
  32. {
  33. int i = , j = ;
  34. getNext();
  35.  
  36. while(i < slen && j < tlen)
  37. {
  38. if(j == - || S[i] == T[j])
  39. {
  40. i++; j++;
  41. }
  42. else
  43. j = _next[j];
  44. }
  45. if(j == tlen)
  46. return i - tlen;
  47. else
  48. return -;
  49. }
  50. /*
  51. 返回模式串在主串S中出现的次数
  52. */
  53. int KMP_Count()
  54. {
  55. int ans = ;
  56. int i, j = ;
  57. if(slen == && tlen == )
  58. {
  59. if(S[] == T[])
  60. return ;
  61. else
  62. return ;
  63. }
  64. getNext();
  65. for(i = ; i < slen; i++)
  66. {
  67. while(j > && S[i] != T[j])
  68. j = _next[j];
  69. if(S[i] == T[j])
  70. j++;
  71. if(j == tlen)
  72. {
  73. ans++;
  74. j = _next[j];
  75. }
  76. }
  77. return ans;
  78. }
  79. int main()
  80. {
  81.  
  82. int TT;
  83. int i, cc;
  84. cin>>TT;
  85. while(TT--)
  86. {
  87. cin>>S>>T;
  88. slen = strlen(S);
  89. tlen = strlen(T);
  90. cout<<"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<endl;
  91. cout<<"模式串T在主串S中出现的次数为: "<<KMP_Count()<<endl;
  92. }
  93. return ;
  94. }

三:KMP最小循环节、循环周期:

定理:假设S的长度为len,则S存在最小循环节,循环节的长度L为len-next[len],子串为S[0…len-next[len]-1]。

(1)如果len可以被len - next[len]整除,则表明字符串S可以完全由循环节循环组成,循环周期T=len/L。

(2)如果不能,说明还需要再添加几个字母才能补全。需要补的个数是循环个数L-len%L=L-(len-L)%L=L-next[len]%L,L=len-next[len]。

学习博客 https://www.cnblogs.com/chenxiwenruo/p/3546457.html

    https://www.cnblogs.com/c-cloud/p/3224788.html

循环节例题

题目链接   https://vjudge.net/problem/UVALive-3026

解析  每个前缀的最小循环节  KMP跑一边判断能不能整除就可以了

AC代码

  1. #include <bits/stdc++.h>
  2. #define pb push_back
  3. #define mp make_pair
  4. #define F first
  5. #define S second
  6. #define all(a) (a).begin(), (a).end()
  7. #define fillchar(a, x) memset(a, x, sizeof(a))
  8. #define huan printf("\n");
  9. using namespace std;
  10. typedef long long ll;
  11. const int maxn=1e6+,inf=0x3f3f3f3f;
  12. const ll mod=1e9+;
  13. char p[maxn];
  14. int f[maxn];
  15. int main()
  16. {
  17. int n,kase=;
  18. while(scanf("%d",&n)==&&n)
  19. {
  20. scanf("%s",p);
  21. f[]=,f[]=;
  22. for(int i=;i<n;i++)
  23. {
  24. int j=f[i];
  25. while(j&&p[i]!=p[j]) j=f[j];
  26. f[i+]=(p[i]==p[j]?j+:);
  27. }
  28. printf("Test case #%d\n", ++kase);
  29. for(int i=;i<=n;i++)
  30. {
  31. if(f[i]>&&i%(i-f[i])==)
  32. printf("%d %d\n",i,i/(i-f[i]));
  33. }
  34. huan;
  35. }
  36. }

UVAlive 3026 KMP 最小循环节的更多相关文章

  1. Cyclic Nacklace hdu3746 kmp 最小循环节

    题意:给出一段字符串  求最少在最右边补上多少个字符使得形成循环串(单个字符不是循环串) 自己乱搞居然搞出来了... 想法是:  如果nex[len]为0  那么答案显然是补len 否则  答案为循环 ...

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

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

  3. Common Divisors CodeForces - 182D || kmp最小循环节

    Common Divisors CodeForces - 182D 思路:用kmp求next数组的方法求出两个字符串的最小循环节长度(http://blog.csdn.net/acraz/articl ...

  4. HDU - 4333 Revolving Digits(拓展kmp+最小循环节)

    1.给一个数字字符串s,可以把它的最后一个字符放到最前面变为另一个数字,直到又变为原来的s.求这个过程中比原来的数字小的.相等的.大的数字各有多少. 例如:字符串123,变换过程:123 -> ...

  5. 【KMP+最小循环节】F. Cyclic Nacklace

    https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/F [题意] 给定一个字符串,问在字符串后最少添加多少个字母,得到的新字符串能是前 ...

  6. [poj 2185] Milking Grid 解题报告(KMP+最小循环节)

    题目链接:http://poj.org/problem?id=2185 题目: Description Every morning when they are milked, the Farmer J ...

  7. hdu3746(kmp最小循环节)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3746 题意:问在一个字符串末尾加上多少个字符能使得这的字符串首尾相连后能够循环 题解:就是利用next ...

  8. HDU 6740 kmp最小循环节

    题意:给一个无线循环小数的前几位,给n,m 选择其中一种出现在前几位的循环节方式(a个数),循环节的长度b 使得n*a-m*b最大 样例: 2 1 12.1212 输出 6 选择2,2*1-1*1=1 ...

  9. hdu 3746 Cyclic Nacklace(kmp最小循环节)

    Problem Description CC always becomes very depressed at the end of this month, he has checked his cr ...

随机推荐

  1. IOS问题

    #import "EXFifthViewController.h" @interface EXFifthViewController () @end @implementation ...

  2. ios项目中引用其他开源项目

    1. 将开源项目的.xcodeproj拖入项目frameworks 2. Build Phases下 Links Binary With Libraries 引入.a文件.Target Depende ...

  3. webuploader上传工具

    http://fex.baidu.com/webuploader/getting-started.html#显示用户选择 Html部分 首先准备dom结构,包含存放文件信息的容器.选择按钮和上传按钮三 ...

  4. [Python筆記] 將 Pandas 的 Dataframe 寫入 Sqlite3

    使用 pandas.io 寫入 Sqlite import sqlite3 as lite from pandas.io import sql import pandas as pd 依照 if_ex ...

  5. SEO 第十章

    SEO第十章 本次课目标: 1.  站外优化方案计划 2.  常见的SEO作弊手段(黑帽) 3.  百度站长平台的使用 4.  网站流量提升和转化率提升 一.站外优化方案计划 友情链接 权重相当.行业 ...

  6. hdu5792 World is Exploding(多校第五场)树状数组求逆序对 离散化

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5792 题目描述:给你n个值,每个值用A[i]表示,然后问你能否找到多少组(a,b,c,d)四个编号,四 ...

  7. springBoot + KISSO实现单点登录

    1:创建一个maven项目 kisso,然后再创建二个子项目都是springboot 2:二个boot项目的pom.xml都是一样的 就这三个依赖,3:接下来就是码代码了,首先在(在我这里)sprin ...

  8. iOS代理模式

    iOS代理模式的简单理解:当一个对象无法直接获取到另一个对象的指针,又希望对那个变量进行一些操作时,可以使用代理模式. 代理主要由三部分组成: (1)协议:用来指定代理双方可以做什么,必须做什么. ( ...

  9. QT_7_资源文件_对话框_QMessageBox_界面布局_常用控件

    资源文件 1.1. 将资源导入到项目下 1.2. 添加文件—>Qt -->Qt Resource File 1.3. 起名称 res ,生成res.qrc文件 1.4. 右键 open i ...

  10. [模板] LIS

    树状数组优化LIS到nlogn,网上找了好多,感觉讲得都不是很明白,正好自己复习整理一下. 基本的DP方程 f[i]=max(f[i],f[j]+1) (j<i且a[j]<a[i]) 定义 ...