求取出现的次数 : 

#include<bits/stdc++.h>
;
char mo[maxn], str[maxn];///mo为模式串、str为主串
int next[maxn];
inline void GetNext()
{
    , j = -, len = strlen(mo);
    next[i] = j;
    while(i < len){
//        if(j == -1 || mo[i] == mo[j]) next[++i] = ++j;
//        else j = next[j];
         && mo[i] != mo[j]) j = next[j];
        next[++i] = ++j;
    }
}
int KmpCount()///计算模式串在子串出现的次数
{
    GetNext();
    , j = , strL = strlen(str), moL = strlen(mo);
    ;
    while(i < strL){
         && mo[j] != str[i]) j = next[j];
        i++, j++;
        if(j == moL) ans++;
    }
    return ans;///返回模式串在主串中出现的次数(可重叠出现)
}
int main(void)
{
    scanf("%s %s", str, mo);
    printf("%d\n", KmpCount());
    ;
}

求模式串第一次在主串出现的位置 or 匹配是否在主串出现过 :

#include<bits/stdc++.h>
;
char mo[maxn], str[maxn];///mo为模式串、str为主串
int next[maxn];
inline void GetNext()
{
    , j = -, len = strlen(mo);
    next[i] = j;
    while(i < len){
         && mo[i] != mo[j]) j = next[j];
        next[++i] = ++j;
    }
}
int KmpIndex()
{
    GetNext();
    , j = , strL = strlen(str), moL = strlen(mo);
    while(i < strL && j < moL){
         && str[i] != mo[j]) j = next[j];
        i++, j++;
    }
    if(j == moL) return i - moL;///返回模式串在主串中首次出现的位置
    ;
}
int main(void)
{
    scanf("%s %s", str, mo);
    printf("%d\n", KmpIndex());
    ;
}

///--------------------------------------------------------------------------------------------------------------------------

KMP算法的解释尤其是next数组可以参考这个博客 : http://blog.csdn.net/yutianzuijin/article/details/11954939/

这个是我对KMP的next数组的一点理解,都写在注释里面了

#include<bits/stdc++.h>
;
char mo[maxn], str[maxn];///分别为模式串和子串
int next[maxn];
/// next[i] 可以"翻译"成 i 这里失配了,考虑 0~(i-1) 这个
/// 串,看能否找到一个位置 k 和 k' 使得前缀 0~k 和后缀
/// k'~(i-1)一样,而next[i]存储的就是 k+1 这个位置,即
/// 前缀的前一个
inline void GetNext()
{
    , j = -, len = strlen(mo);
    next[i] = j;
    while(i < len){
         && mo[i] != mo[j]) j = next[j];
        next[++i] = ++j;
    }
}
///-------------------------------------------------------------
///可以用下面的图来动态演示一下GetNext()的步骤,可能就能够理解
//                  i
//- 0 1 2 3 4 5 6 7 8
//  a b c a b c a d x
//  - 0 0 0 1 2 3 4 0
//                  a b c a b c a d x
//                  - 0 0 0 1 2 3 4 0
//                  j
///下面有几句话可能能帮助理解
///①找next的值相当于就是拿模式串自己和自己匹配,在下面移动的就是后缀,在上面的就是前缀
///②当前匹配的字符以及其前面的字符的next值肯定是已经求出来的
///③当j==-1的时候就说明现在的i连模式串的第一个都不能匹配到
///④如果是判断当前的 i 和 j 则说明是在为 i+1 这个字符寻找 0~i (即i+1后的字符串)是否拥有相同前后缀
///--------------------------------------------------------------
int KmpCount()
{
    GetNext();
    , j = , strL = strlen(str), moL = strlen(mo);
    ;
    while(i < strL){
         && mo[j] != str[i]) j = next[j];///匹配的时候当 j == -1 的时候就已经是第
        i++, j++;                                      ///一个现在的主串 i 连模式串的第一个都不
        if(j == moL) ans++;                            ///能匹配,所以下面让 i++,因为 j == -1,
    }                                                  ///所以 j++ 后自然是子串第一个
    return ans;
}

KMP模版 && KMP求子串在主串出现的次数模版的更多相关文章

  1. KMP小扩展,找出子串在主串中出现的所有位置

    KMP算法能够高效地匹配字符串,找出子串(T串)在主串(S串)中出现的首个位置的原算法网上已经有很多优秀的博文进行详细讲解,这里就不多赘述. 这篇博文主要是对KMP原算法稍作改动,使其能够在主串中把所 ...

  2. POJ-3461 Oulipo(KMP,模式串在主串中出现次数)

    题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...

  3. POJ 3461 Oulipo(KMP,模式串在主串中出现次数 可重叠)

    题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...

  4. POJ 3461 Oulipo(模式串在主串中出现次数 可重叠)

    Oulipo [题目链接]Oulipo [题目类型]KMP &题意: 给你两个字符串p和s,求出p在s中出现的次数. &题解: kmpC函数就是解题的,其中也就j=nex[j]难理解一 ...

  5. JAVA常见算法题(三十三)---求子串在字符串中出现的次数

    计算某字符串中子串出现的次数. public static void main(String[] args) { String s1 = "adcdcjncdfbcdcdcd"; ...

  6. C#查找子串在原串中出现次数

    提供的是一种思路,和具体语言无关. string test = "good good study day day up"; string r = test.Replace(&quo ...

  7. 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))

    串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...

  8. Blue Jeans---poj3080(kmp+暴力求子串)

    题目链接:http://poj.org/problem?id=3080 题意就是求n个长度为60的串中求最长公共子序列(长度>=3):如果有多个输出字典序最小的: 我们可以暴力求出第一个串的所有 ...

  9. HDU 1686 Oulipo【kmp求子串出现的次数】

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

随机推荐

  1. PTA(Advanced Level)1046.Shortest Distance

    The task is really simple: given N exits on a highway which forms a simple cycle, you are supposed t ...

  2. # 数字签名&数字证书

    目录 数字签名&数字证书 数字签名 数字证书 数字证书的实例(https协议) 数字签名&数字证书 参考资料: 数字签名是什么?-阮一峰的网络日志 数字签名和数字证书究竟是什么?知乎- ...

  3. python网络编程-Json序列化功能扩展-软件开发架构-OSI七层协议-TCP-01

    面向对象补充知识点(面向对象的应用) 扩展json序列化所支持的数据类型(分析源码) import json from datetime import datetime, date # ------- ...

  4. SVN服务器搭建与配置管理

    1.下载和搭建SVN服务器 现在Subversion已经迁移到Apache网站上了,下载地址:http://subversion.apache.org/packages.html,这是二进制文件包的下 ...

  5. Java并发理论简介

    这些文字来自于Java程序员修炼之道,记录一下 一. java线程模型 Java线程模型建立在两个基本概念之上 共享的,默认可见的可变状态 抢占式线程调度 我们从侧面思考一下这两个概念 所有线程可以很 ...

  6. C# 面向对象1(类和对象的概念)

    1.面向过程-->面向对象 面向过程:面向的是完成这件事儿的过程,强调的是完成这件事儿的动作. 2.面向过程的思想: 以上的,需求一更改,会导致不同的方法,一一去更改. 3.面向对象的思想:找个 ...

  7. java实现spark常用算子之filter

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  8. Nginx做代理路由时,不转发http的header问题

    从header里面拿不到 TX_XID这种类型的字段, Nginx 会默认忽略含有 “_” 的 header 参数,而 TX_XID值的参数名恰好含有 “_” 符号,需要手动开启转发. 在 nginx ...

  9. 使用Mybatis Generator自动生成代码

    MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将为所有版本的MyBatis以及版本2.2.0之后的iBATIS版本生成代码.它将内省数据库 ...

  10. vi 纵向模式编辑

    Vim 的纵向编辑模式 vim解读 vi解读 批量删除# 技巧: r 进入修改模式 I 进入行首插入模式 A 进入行尾插入模式 r替换 I前前添加 A后添加 1.多行注释: a. 按下Ctrl + v ...