kmp

  1. 1 #include <algorithm>
  2. 2 #include <iostream>
  3. 3 #include <cstring>
  4. 4 #include <cstdio>
  5. 5
  6. 6 using namespace std;
  7. 7
  8. 8 struct KMP{
  9. 9 char y[1010];//主串
  10. 10 char x[1010];//模式串
  11. 11 int n,m;
  12. 12 int next[1010];
  13. 13
  14. 14 int init(){
  15. 15 scanf("%s%s",y,x);
  16. 16 n=strlen(y);
  17. 17 m=strlen(x);
  18. 18 kmp_pre();
  19. 19 //prekmp();
  20. 20 return 1;
  21. 21 }
  22. 22
  23. 23 void kmp_pre(){//生成next数组
  24. 24 int i,j;
  25. 25 j=next[0]=-1;
  26. 26 i=0;
  27. 27 while(i<m){
  28. 28 while(-1!=j&&x[i]!=x[j])j=next[j];
  29. 29 next[++i]=++j;
  30. 30 }
  31. 31 }
  32. 32
  33. 33 /*void prekmp(){
  34. 34 int i,j;
  35. 35 j=next[0]=-1;
  36. 36 i=0;
  37. 37 while(i<m){
  38. 38 while(-1!=j&&x[i]!=x[j])j=next[j];
  39. 39 if(x[++i]==x[++j])next[i]=next[j];
  40. 40 else next[i]=j;
  41. 41 }
  42. 42 }*/
  43. 43
  44. 44 int kmp_count(){
  45. 45 int i,j;
  46. 46 int ans;
  47. 47 i=j=ans=0;
  48. 48 while(i<n){
  49. 49 while(-1!=j&&y[i]!=x[j])j=next[j];
  50. 50 i++;j++;
  51. 51 if(j>=m){
  52. 52 ans++;
  53. 53 j=next[j];
  54. 54 }
  55. 55 }
  56. 56 return ans;
  57. 57 }
  58. 58 };
  59. 59
  60. 60 int main()
  61. 61 {
  62. 62 KMP a;
  63. 63 while(a.init())
  64. 64 printf("%d\n",a.kmp_count());
  65. 65 return 0;
  66. 66 }
  67. 67 //如果n%(n-next[n])==0,则存在重复连续子串,长度为n-next[n]。

扩展kmp

  1. 1 #include <algorithm>
  2. 2 #include <iostream>
  3. 3 #include <cstring>
  4. 4 #include <cstdio>
  5. 5
  6. 6 using namespace std;
  7. 7
  8. 8 struct KZ_KMP{//求最长公共前缀
  9. 9 char y[1010];//主串
  10. 10 char x[1010];//模式串
  11. 11 int n,m;
  12. 12 int next[1010];//next[i]:x[i...m-1]与x[0...m-1]的最长公共前缀
  13. 13 int extend[1010];//extend[i]:y[i...n-1]与x[0...m-1]的最长公共前缀
  14. 14
  15. 15 int init(){
  16. 16 scanf("%s%s",y,x);
  17. 17 n=strlen(y);
  18. 18 m=strlen(x);
  19. 19 pre_EKMP();
  20. 20 EKMP();
  21. 21 return 1;
  22. 22 }
  23. 23
  24. 24 void pre_EKMP(){
  25. 25 next[0]=m;
  26. 26 int j=0;
  27. 27 while(j+1<m&&x[j]==x[j+1])j++;
  28. 28 next[1]=j;
  29. 29 int k=1;
  30. 30 for(int i=2;i<m;i++){
  31. 31 int p=next[k]+k-1;
  32. 32 int L=next[i-k];
  33. 33 if(i+L<p+1)next[i]=L;
  34. 34 else{
  35. 35 j=max(0,p-i+1);
  36. 36 while(i+j<m&&x[i+j]==x[j])j++;
  37. 37 next[i]=j;
  38. 38 k=i;
  39. 39 }
  40. 40 }
  41. 41 }
  42. 42
  43. 43 void EKMP(){
  44. 44 int j=0;
  45. 45 while(j<n&&j<m&&x[j]==y[j])j++;
  46. 46 extend[0]=j;
  47. 47 int k=0;
  48. 48 for(int i=1;i<n;i++){
  49. 49 int p=extend[k]+k-1;
  50. 50 int L=next[i-k];
  51. 51 if(i+L<p+1)extend[i]=L;
  52. 52 else{
  53. 53 j=max(0,p-i+1);
  54. 54 while(i+j<n&&j<m&&y[i+j]==x[j])j++;
  55. 55 extend[i]=j;
  56. 56 k=i;
  57. 57 }
  58. 58 }
  59. 59 //printf("%d ",extend[0]);
  60. 60 }
  61. 61 };
  62. 62
  63. 63 int main()
  64. 64 {
  65. 65 KZ_KMP a;
  66. 66 while(a.init()){
  67. 67 }
  68. 68 return 0;
  69. 69 }

kmp与扩展kmp模板的更多相关文章

  1. Manacher模板,kmp,扩展kmp,最小表示法模板

    *N]; //储存临时串 *N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); ; ;i<len;i++) { s[cnt++]= ...

  2. KMP和扩展KMP【转】

    这种东西基本上在纸上自己推导一下就能做出来XD 转发注明出处 KMP 给出两个字符串A(称为模板串)和B(称为子串),长度分别为lenA和lenB,要求在线性时间内,对于每个A[i] (0<=i ...

  3. KMP与扩展KMP

    原文转自:http://www.cppblog.com/MatoNo1/archive/2011/04/17/144390.aspx KMP:给出两个字符串A(称为模板串)和B(称为子串),长度分别为 ...

  4. KMP && Manacher && 扩展KMP整理

    KMP算法: kmp示例代码: void cal_next(char *str, int *next, int len) { next[0] = -1;//next[0]初始化为-1,-1表示不存在相 ...

  5. KMP 、扩展KMP、Manacher算法 总结

    一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 P ...

  6. 666 专题三 KMP &#38; 扩展KMP &#38; Manacher

    KMP: Problem A.Number Sequence d.求子串首次出现在主串中的位置 s. c. #include<iostream> #include<stdio.h&g ...

  7. KMP和扩展KMP

    文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...

  8. 【kmp或扩展kmp】HDU 6153 A Secret

    acm.hdu.edu.cn/showproblem.php?pid=6153 [题意] 给定字符串A和B,求B的所有后缀在A中出现次数与其长度的乘积之和 A和B的长度最大为1e6 方法一:扩展kmp ...

  9. KMP 和 扩展KMP

    KMP:在主串S中找子串T的位置KMP算法的时间复杂度O(|S|+|T|). #define maxn 1000 char s[maxn],t[maxn];//s为主串,t为子串 int net[ma ...

随机推荐

  1. vue-router(路由)详细教程

    vue-router(路由)详细教程:https://blog.csdn.net/wulala_hei/article/details/80488727 vue路由组件传参-页面通信:https:// ...

  2. 第一节 初识RabbitMQ

    原文:第一节 初识RabbitMQ 版权声明:未经本人同意,不得转载该文章,谢谢 https://blog.csdn.net/phocus1/article/details/87280120 1.什么 ...

  3. C# 编程—字符串(方法应用)、数学Math函数、DateTime、异常捕获、其他

    其他:        #--任意位数字,有几位显示几位        0--至少以为数字,不足则补0        例如:#.00--必须保留两位小数 字符串(string): Length  长度 ...

  4. python bezier 曲线

    1.手写bezier公式,生成bezier代码, 如果给的点数过多,则会生成一半bezier曲线,剩下的一半就需要进行拼接: import numpy as np import matplotlib. ...

  5. 几种RAID级别的比较

    等级 概要 冗余 盘数 读快 写快 RAID 0 便宜.快速.危险 No N Yes Yes RAID 1 高速度.简单.安全 Yes 2(通常) Yes No RAID 5 安全(速度)成本折中 Y ...

  6. k8s--网络模式

    1.clusterip kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: nginx ports ...

  7. C语言结构体实例-创建兔子

    参考裸编程思想. #include <stdio.h> //#include "ycjobject.h" // 颜色定义 #define CL_BLACK 0 #def ...

  8. JavaSE---多线程---线程的控制

    1.Java提供了一些工具方法,可以便捷控制线程的执行: 1.1 join Thread提供了让一个线程等待另一个线程执行完成的方法:join: 当某个程序的执行流中调用其他线程的join方法,该线程 ...

  9. java html生成PDF,并打印

    import java.io.File; import java.io.FileOutputStream; import org.zefer.pd4ml.PD4Constants; import or ...

  10. 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化

    B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...