链接  HDU 1711 Number Sequence

KMP 算法

我以自己理解写的,写的不对,不明白的地方海王子出来,一起共同学习;

字符串匹配 就是KMP,一般思想,用一个for循环找开头   如果开头一样进入第二个for循环;这样统计  直观 容易理解。但是时间复杂度比较长。所以就有KMP  这个算法了

KMP 大体思想因为在上一个方法之中,有的字符重复比较了,使得找到目标字符窜效率比较低,

比如   :目标串为:   ① a b a b c

在                 ② a b a a b a b c d a b c d b c  这个字符窜中找到上述目标串;

如用  i,j  来表示①,②两个字符串的下标,假设下标从一开始;

i=1,j=1    a=a;

i=2,j=2    b=b;

i=3,j=3    a=a;

i=4;j=4    b!=a;  此时如果只将①字符串右移动一位,虽然可以;但是,假如你移动两位看看怎么样?

a b a b c

a b a a b a b c d a b c d b c

是不是觉得移动2格对得非常整齐?

那么为什么移动两个?

第3个a与第一个a正好重复!所以我们知道重复单元就知道移动多少。需要一个数组记录当两个字符不相等,i 应该指向哪个!记录重复单元的值,叫做部分匹配值!不懂可以百度部分匹配值!以上就是KMP 核心思想

下面贴一个代码!!两种写法!//屏蔽是另一种写法

[cpp] view
plain
 copy

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int N[1000005],M[10005],a[10005],n,m;
  7. void set_a()
  8. {
  9. int i,j;
  10. a[1]=0;
  11. j=1;
  12. for(i=2; i<=m; i++)
  13. {
  14. if(M[j]==M[i])
  15. {
  16. a[i]=j;
  17. j++;
  18. }
  19. else if(M[j]!=M[i]&&M[i]==M[1])
  20. {
  21. a[i]=1;
  22. j=2;
  23. }
  24. else
  25. {
  26. a[i]=0;
  27. j=1;
  28. }
  29. }
  30. //    for(i=1; i<=m; i++)
  31. //        printf("%d ",a[i]);
  32. //    printf("\n");
  33. }
  34. int kmp()
  35. {
  36. int i=1,j=1,k;
  37. set_a();
  38. while(i<=n)
  39. {
  40. if(j==1&&N[i]!=M[j]) i++;
  41. if(N[i]==M[j])
  42. {
  43. i++;
  44. j++;
  45. }
  46. else j=a[j-1]+1;
  47. if(j==m+1) return i-m;
  48. }
  49. return -1;
  50. }
  51. int main()
  52. {
  53. int t;
  54. scanf("%d",&t);
  55. while(t--)
  56. {
  57. //int b; scanf("%d",&b);
  58. int i;
  59. scanf("%d%d",&n,&m);
  60. memset(a,0,sizeof(a));
  61. for(i=1; i<=n; i++)
  62. scanf("%d",&N[i]);
  63. for(i=1; i<=m; i++)
  64. scanf("%d",&M[i]);
  65. printf("%d\n",kmp());
  66. }
  67. return 0;
  68. }
  69. ///**********************KMP****************************/
  70. //
  71. //#include<stdio.h>
  72. //#include<string.h>
  73. //using namespace std;
  74. //int lena,lenb;
  75. //int a[1000005],b[10005];
  76. //int next[200000];
  77. //void set_naxt()//子串的next数组
  78. //{
  79. //    int i=0,j=-1;
  80. //    next[0]=-1;
  81. //    while(i<lenb)
  82. //    {
  83. //        if(j==-1||b[i]==b[j])
  84. //        {
  85. //            i++;
  86. //            j++;
  87. //            next[i]=j;
  88. //        }
  89. //        else
  90. //            j=next[j];
  91. //    }
  92. //    // printf(">>%d\n",next[lenb-1]);
  93. //    for(i=1; i<=lenb; i++)
  94. //        printf("%d ",next[i]);
  95. //    printf("\n");
  96. //}
  97. //
  98. //int kmp()
  99. //{
  100. //    int i=0,j=0;
  101. //    set_naxt();
  102. //    while(i<lena)
  103. //    {
  104. //        if(j==-1||a[i]==b[j])
  105. //        {
  106. //            i++;
  107. //            j++;
  108. //        }
  109. //        else
  110. //            j=next[j];
  111. //        if(j==lenb)
  112. //            return i-j+1;
  113. //    }
  114. //    return -1;
  115. //}
  116. //int main()
  117. //{
  118. //    int i,t;
  119. //    scanf("%d",&t);
  120. //    while(t--)
  121. //    {
  122. //        memset(next,0,sizeof(next));
  123. //        scanf("%d%d",&lena,&lenb);
  124. //        for(i=0; i<lena; i++)
  125. //            scanf("%d",&a[i]);
  126. //        for(i=0; i<lenb; i++)
  127. //            scanf("%d",&b[i]);
  128. //        printf("%d\n",kmp());
  129. //    }
  130. //}

HDU 1711(KMP)字符串匹配的更多相关文章

  1. {Reship}{KMP字符串匹配}

    关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827

  2. 洛谷P3375 - 【模板】KMP字符串匹配

    原题链接 Description 模板题啦~ Code //[模板]KMP字符串匹配 #include <cstdio> #include <cstring> int cons ...

  3. Luogu 3375 【模板】KMP字符串匹配(KMP算法)

    Luogu 3375 [模板]KMP字符串匹配(KMP算法) Description 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来 ...

  4. 洛谷P3375 [模板]KMP字符串匹配

    To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...

  5. P3375 【模板】KMP字符串匹配

    P3375 [模板]KMP字符串匹配 https://www.luogu.org/problemnew/show/P3375 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在 ...

  6. 洛谷—— P3375 【模板】KMP字符串匹配

    P3375 [模板]KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next. (如 ...

  7. P3375 模板 KMP字符串匹配

    P3375 [模板]KMP字符串匹配 来一道模板题,直接上代码. #include <bits/stdc++.h> using namespace std; typedef long lo ...

  8. KMP字符串匹配 模板 洛谷 P3375

    KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...

  9. KMP字符串匹配学习

    KMP字符串匹配学习 牛逼啊 SYC大佬的博客

  10. hdu 1711 KMP算法模板题

    题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串 ...

随机推荐

  1. 记录一下 ps命令找出线程占用cpu情况

    https://blog.csdn.net/xnn2s/article/details/11865339

  2. CMDB资产管理系统的数据表设计

    Server表: asset = models.OneToOneField('Asset') 主机名(hostname) sn号(sn) 制造商(manufacture) 系统(os_platform ...

  3. 连接mysql报错 : The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone...

    time zone 时区错误 DBEAVER连接MySQL运行报错The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or repres ...

  4. mysql delete语句不能用别名

    在mysql数据库里运行delete语句 delete ’; 发现会报错: [Err] - You have an error in your SQL syntax; check the manual ...

  5. C语言之基本算法34—分解质因数(方法一)

    //矩阵基础 /* ================================================================== 题目:输入一个正整数.将其分解为质因式,如:6 ...

  6. mac上的xampp出现Access forbidden! You don’t have permission to access the requested object. It is either

    一个Joomla!程序,之前是在win上的xampp上运行得非常好的,当我把它拿到mac下面的xampp上去运行的时候,发现有问题,没法运行,报以下的错误: Access forbidden!  Yo ...

  7. iOS多线程编程指南

    iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...

  8. Eureka vs Zookeeper

    著名的CAP理论指出,一个分布式系统不可能同时满足C(一致性).A(可用性)和P(分区容错性).由于分区容错性在是分布式系统中必须要保证的,因此我们只能在A和C之间进行权衡.在此Zookeeper保证 ...

  9. [网页游戏开发]Morn组件赋值

    在讲解List之前,我们先介绍一下Morn组件赋值功能 默认属性赋值 界面逻辑开发过程中,经常会涉及到动态更改UI属性,比如: 界面有一个按钮,一个多选框和一个文本,分别命名为myButton,myC ...

  10. WebService:JAX-WS实现WebService

    WebService和Java核心技术中的RMI一样用于实现异构平台上的应用程序之间数据的交互,唯一不同的是这样的技术屏蔽了语言之间的差异.这也是其大行其道的原因. 实现WebService的技术多种 ...