之前写KMP模板的时候,nx[i]代表最大的一个x,使s[1,x-1]是s[1,i-1]的后缀。(方法1)

然而网上还有另一种方法求nx数组,nx[i]表示最大的一个x,使s[1,x]是s[1,i]的后缀。(方法2)

两种nx数组在具体匹配的时候方法稍有不同,但都能正确匹配字符串。

但是在做字符串DP题的时候,发现网上的题解大多是利用第二种nx数组的性质进行状态的转移。

当时试着写了一下那种nx的求法,但是觉得很别扭,用不惯也记不住。

不知所措。

今天看了一下洛谷的KMP模板(P3375)(传送门),发现得求出第二种nx数组......

这回把第二种求法忘了,也很反感那么写。

于是立志要找出两种方法的联系。

很简单嘛:nx2[i]=nx1[i+1]-1

同时,getnx的时候要走到m+1(m为模式串长),这样nx[m+1]才有值。

给一个洛谷P3375的代码。

注意getnx的改动和最后要求输出nx数组的时候是怎么操作的。

  1. #include<cstdio>
  2. #include<cstring>
  3.  
  4. char s1[],s2[];
  5. int nx[];
  6. int pos[],cnt;
  7. int n,m;
  8.  
  9. void getnx()
  10. {
  11. nx[]=;
  12. for(int i=,j=;i<=m+;)
  13. {
  14. nx[i]=j;
  15. while(j&&s2[i]!=s2[j])j=nx[j];
  16. i++,j++;
  17. }
  18. }
  19.  
  20. void kmp()
  21. {
  22. for(int i=,j=;i<=n;)
  23. {
  24. while(j&&s1[i]!=s2[j])j=nx[j];
  25. if(j==m)
  26. {
  27. pos[++cnt]=i-m+;
  28. j=nx[j];
  29. }
  30. else i++,j++;
  31. }
  32. }
  33.  
  34. int main()
  35. {
  36. scanf("%s",s1+);
  37. scanf("%s",s2+);
  38. n=strlen(s1+);
  39. m=strlen(s2+);
  40. getnx();
  41. kmp();
  42. for(int i=;i<=cnt;i++)printf("%d\n",pos[i]);
  43. for(int i=;i<=m;i++)printf("%d ",nx[i+]-);
  44. return ;
  45. }

关于KMP算法的重大发现的更多相关文章

  1. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b      子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

  2. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  3. 数据结构与算法JavaScript (五) 串(经典KMP算法)

    KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...

  4. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  5. 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

    之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...

  6. 算法:KMP算法

    算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...

  7. BF算法与KMP算法

    BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

  8. KMP算法-next函数求解

    KMP函数求解:一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串 ...

  9. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

随机推荐

  1. Fib数列问题(项数很大)

    用fib(n)表示斐波那契数列的第n项,现在要求你求fib(n) mod m.fib(1)= 1, fib(2)= 1. 输入格式 输入2个整数n(1≤n≤1018), m(2≤m≤10000000) ...

  2. jsp动作标签学习

    <jsp:useBean> <jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象,如果存在则直接返回该JavaBean对象的引用,如果不存在则实 ...

  3. RabbitMQ 整合 SpringCloud实战

    RabbitMQ 整合 SpringCloud实战RabbitMQ 整合 SpringCloud实战rabbitmq-common 子项目rabbitmq-springcloud-consumer 子 ...

  4. Python—使用Json序列化Datetime类型

    import json from datetime import datetime, date """ str,int,list,tuple,dict,bool,None ...

  5. 游程编码run length code

    今天突然看到一个名词,游程编码.也叫行程编码. 简单理解就是,几个相同连续的字符,然后用数字统计表示. 举个例子: aaaabbbccc 用游程编码的表示就是4a3b3c 如果:连续字符只有一个 那么 ...

  6. Python 学习笔记:Python 中单引号(')、双引号(")、三引号(''',""")的使用以及不转义字符串

    一.单引号.双引号及三引号: 参考博客:https://www.cnblogs.com/chenhuan001/p/8006017.html 以上四种形式都是 Python 表示字符串的方式,具体的效 ...

  7. Java中:>>>和>>区别

    >>>表示不带符号向右移动二进制数,移动后前面统统补0:两个箭头表示带符号移动, 没有<<<这种运算符,因为左移都是补零,没有正负数的区别. 如 -12 的二进制为 ...

  8. 几个Java基础题

    1.java中线程能不能重复start t1.start();        System.out.println("ssss");        t1.start(); 答:第一 ...

  9. goweb-访问数据库

    访问数据库 对许多Web应用程序而言,数据库都是其核心所在.数据库几乎可以用来存储你想查询和修改的任何信息,比如用户信息.产品目录或者新闻列表等. Go没有内置的驱动支持任何的数据库,但是Go定义了d ...

  10. CodeForces 1005D Polycarp and Div 3(思维、贪心、dp)

    http://codeforces.com/problemset/problem/1005/D  题意: 给一个仅包含数字的字符串,将字符串分割成多个片段(无前导0),求这些片段里最多有多少是3的倍数 ...