人太蠢,,看了一天的KMP。。

刚開始看训练指南的,,后来才惊奇的发现原来刘汝佳写的f数组并非Next数组!

总认为和之前看过的全然不一样。。

后来又百度了一下KMP,研究了非常久,然后用自己的逻辑写了一份

http://blog.chinaunix.net/uid-23767307-id-5033555.html

这个人把KMP大篇幅的讲了。。大家能够看看。

个人觉得仅仅要能理解Next数组的意义后,写出KMP算法就不是非常难了

然而自己语文也不好就不多做解释了,,直接贴下我的模板好了

#include<map>
#include<set>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std; const int MX = 1e6 + 5; char S1[MX], S2[MX];
int Next[MX]; int KMP(char *A, char *B) {
int m = strlen(A), n = strlen(B); Next[0] = 0;
for(int i = 1; i < n; i++) {
int k = Next[i - 1];
while(B[i] != B[k] && k) k = Next[k - 1];
Next[i] = B[i] == B[k] ? k + 1 : 0;
} int ans = 0, j = 0;
for(int i = 0; i < m; i++) {
while(A[i] != B[j] && j) j = Next[j - 1];
if(A[i] == B[j]) j++;
if(j == n) ans++;
}
return ans;
} int main() {
int T, ansk = 0;
//freopen("input.txt", "r", stdin);
scanf("%d", &T);
while(T--) {
scanf("%s%s", S1, S2);
printf("%d\n", KMP(S2, S1));
}
return 0;
}

当中,假设想函数返回的是出现的次数,而不是匹配的次数

由于匹配的次数中会有一些部分是重叠的。那仅仅要改一个地方即可了

把if(j == n) ans++;换成if(j == n) ans++, j = 0;就能够了

int KMP(char *A, char *B) {//A是被搜索的串,B是搜索的内容,返回B在A中出现的次数
int m = strlen(A), n = strlen(B); Next[0] = 0;
for(int i = 1; i < n; i++) {
int k = Next[i - 1];
while(B[i] != B[k] && k) k = Next[k - 1];
Next[i] = B[i] == B[k] ? k + 1 : 0;
} int ans = 0, j = 0;
for(int i = 0; i < m; i++) {
while(A[i] != B[j] && j) j = Next[j - 1];
if(A[i] == B[j]) j++;
if(j == n) ans++, j = 0;
}
return ans;
}

KMP hihoCoder1015 KMP算法的更多相关文章

  1. KMP及其改进算法

    本文主要讲述KMP已经KMP的一种改进方法.若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经 ...

  2. 第四十一课 KMP子串查找算法

    问题: 右移的位数和目标串没有多大的关系,和子串有关系. 已匹配的字符数现在已经有了,部分匹配值还没有. 前六位匹配成功就去查找PMT中的第六位. 现在的任务就是求得部分匹配表. 问题:怎么得到部分匹 ...

  3. 数据结构开发(14):KMP 子串查找算法

    0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...

  4. 字符串类——KMP子串查找算法

    1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是 ...

  5. kmp&扩展kmp

    kmp: KMP的主要目的是求B是不是A的子串,以及若是,B在A中所有出现的位置 写的很详细的大佬的博客:http://www.matrix67.com/blog/archives/115 模板: / ...

  6. hihocoder1015 kmp算法

    #1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...

  7. 【数据结构】 字符串&KMP子串匹配算法

    字符串 作为人机交互的途径,程序或多或少地肯定要需要处理文字信息.如何在计算机中抽象人类语言的信息就成为一个问题.字符串便是这个问题的答案.虽然从形式上来说,字符串可以算是线性表的一种,其数据储存区存 ...

  8. 第41课 kmp子串查找算法

    1. 朴素算法的改进 (1)朴素算法的优化线索 ①因为 Pa != Pb 且Pb==Sb:所以Pa != Sb:因此在Sd处失配时,子串P右移1位比较没有意义,因为前面的比较己经知道了Pa != Sb ...

  9. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...

随机推荐

  1. 你真的了解try{ return }finally{}中的return?(转载)

    发现一篇有意思的博文,分享一下 谁能给我我解释一下这段程序的结果为什么是:2.而不是:3 代码如下: class Test { public int aaa() { int x = 1; try { ...

  2. insert语句太长,有StringBuilder优化一下

    private void btnSave_Click(object sender, RoutedEventArgs e) { if (IsInsert) { //假设日历控件没有选日期,那帮它赋一个当 ...

  3. Alfresco 5.0.d 企业文档管理系统

    Thanks for downloading Alfresco Community Edition. Your download should begin in three seconds. If i ...

  4. ThreadLocal的实现原理(读书笔记)

    ThreadLocal的set方法和get方法,从set方法开始: public void set(T value) { Thread t = Thread.currentThread();//获取当 ...

  5. CMake 设置Target输出目录和后缀名

    一. SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/../bin) 上面的语句能设置可执行文件的输出目录 在Win + VS环境下,会自动在你所设置 ...

  6. 个人或者企业怎么进行app开发?开发一款APP应用大概须要多少钱?

    App开发.是指专注于手机应用软件开发与服务. App是application的缩写,通常专指手机上的应用软件,或称手机client.另外眼下有非常多在线app开发平台.当然移动互联网时代是全民的移动 ...

  7. 来自oaim的一些推广信息

    笔者几年工作经历亲身走访过一些玻璃深加工企业,发现很重要的一种工具装载玻璃的铁架.而许多企业由于缺少实际操作的经验,导致部分铁架从被制作出来就让我们的成品存在质量缺陷的隐患,最常见的是装好中空玻璃,当 ...

  8. SpringBoot学习小结

    基于Spring,简化Spring应用开发的框架,整个Spring技术栈的大整合,J2EE开发的一站式解决方案 优点: 快速创建独立运行的Spring项目以及集成主流框架 使用嵌入式的Servlet容 ...

  9. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第9章节--client对象模型和REST APIs概览 client对象模型API范围         本章之前提到过. ...

  10. 经常使用传感器协议3:CJ/T-188 冷热量表协议解析2

        本文详细阐述JY公司冷热量表(记热量)传输协议.并以此说明CJ/T-188协议在厂家详细应用时,并不一致. 本文及兴许文章将对这些不同点予以总结(文中所述协议与日志"CJ/T-188 ...