求取出现的次数 : 

#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. Oracle-DDL 2- 视图&索引

    DDL-数据定义语句: 二.视图 --视图(view),本身不保存数据,保存的是一个查询语句--对视图的操作等同于对查询语句中源数据的操作--视图占用存储空间较小,可以快速的对特定数据进行访问和操作- ...

  2. azkaban安装步骤

    安装包 1.得到软件包 azkaban-executor-server-2.5.0.tar.gz azkaban-sql-script-2.5.0.tar.gz azkaban-web-server- ...

  3. Linux软链接硬链接的区别

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在 ...

  4. Python 入门 之 异常处理

    Python 入门 之 异常处理 1.异常处理 (1)程序中的错误分为两种 <1> 语法错误 (这种错误,根本过不了Python解释器的语法检测,必须在程序执行前就改正) # 语法错误示范 ...

  5. Wizard's Tour CodeForces - 860D (图,构造)

    大意: 给定$n$节点$m$条边无向图, 不保证连通, 求选出最多邻接边, 每条边最多选一次. 上界为$\lfloor\frac{m}{2}\rfloor$, $dfs$贪心划分显然可以达到上界. # ...

  6. softmax函数笔记

  7. 转换byte(十进制)为图形(大小写字母,符号)

    /** * 转换byte(十进制)为字母 */ public static String ByteToLetter (byte[] chars) { String Letter = "&qu ...

  8. 键盘事件 Ctrl+p 模拟(vue)

    方法定义 // 打印页面 printpage(myDiv) { // myDiv 为打印对象的id名 var newstr = document.getElementById(myDiv).inner ...

  9. 多线程编程-- part5.1 互斥锁之非公平锁-获取与释放

    非公平锁之获取锁 非公平锁和公平锁在获取锁的方法上,流程是一样的:它们的区别主要表现在“尝试获取锁的机制不同”.简单点说,“公平锁”在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待):而 ...

  10. nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'enterpriseId' in 'class java.lang.String'

    错误信息: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for p ...