KMP hihoCoder1015 KMP算法
人太蠢,,看了一天的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算法的更多相关文章
- KMP及其改进算法
本文主要讲述KMP已经KMP的一种改进方法.若发现不正确的地方,欢迎交流指出,谢谢! KMP算法的基本思想: KMP的算法流程: 每当一趟匹配过程中出现字符比较不等时,不需回溯 i 指针,而是利用已经 ...
- 第四十一课 KMP子串查找算法
问题: 右移的位数和目标串没有多大的关系,和子串有关系. 已匹配的字符数现在已经有了,部分匹配值还没有. 前六位匹配成功就去查找PMT中的第六位. 现在的任务就是求得部分匹配表. 问题:怎么得到部分匹 ...
- 数据结构开发(14):KMP 子串查找算法
0.目录 1.KMP 子串查找算法 2.KMP 算法的应用 3.小结 1.KMP 子串查找算法 问题: 如何在目标字符串S中,查找是否存在子串P? 朴素解法: 朴素解法的一个优化线索: 示例: 伟大的 ...
- 字符串类——KMP子串查找算法
1, 如何在目标字符串 s 中,查找是否存在子串 p(本文代码已集成到字符串类——字符串类的创建(上)中,这里讲述KMP实现原理) ? 1,朴素算法: 2,朴素解法的问题: 1,问题:有时候右移一位是 ...
- kmp&扩展kmp
kmp: KMP的主要目的是求B是不是A的子串,以及若是,B在A中所有出现的位置 写的很详细的大佬的博客:http://www.matrix67.com/blog/archives/115 模板: / ...
- hihocoder1015 kmp算法
#1015 : KMP算法 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在 ...
- 【数据结构】 字符串&KMP子串匹配算法
字符串 作为人机交互的途径,程序或多或少地肯定要需要处理文字信息.如何在计算机中抽象人类语言的信息就成为一个问题.字符串便是这个问题的答案.虽然从形式上来说,字符串可以算是线性表的一种,其数据储存区存 ...
- 第41课 kmp子串查找算法
1. 朴素算法的改进 (1)朴素算法的优化线索 ①因为 Pa != Pb 且Pb==Sb:所以Pa != Sb:因此在Sd处失配时,子串P右移1位比较没有意义,因为前面的比较己经知道了Pa != Sb ...
- 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)
本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...
随机推荐
- inner join, left join ,right join 结果
假设有两个表结构如下: 表table1 表 table 2 内连接: --内连接 select * from table1 inner join table2 on table1.ID = table ...
- Spring的学习(IoC,AOP)等
下面这个系列是非常好的例子: http://www.yiibai.com/spring/spring-3-hello-world-example.html 正在看,把一些基础夯实. IoC可以从下面一 ...
- 纯C实现面向对象之接口编程
创建如下文件目录 : Shape.h #include <stdlib.h> //接口 #ifndef Interface #define Interface struct #endif ...
- http://blog.csdn.net/pet8766/article/details/8186955
http://blog.csdn.net/pet8766/article/details/8186955
- app crash率的标准
手Q定义是: android: 发布目标是低于1% ios: 0.8%以下
- Json杂谈系列------(一)初始json
1. JSON 是什么 JSON,全称是 JavaScript Object Notation,即 JavaScript 对象标记法.这是一种轻量级(Light-Weight).基于文本的(Text- ...
- Vue 过滤器filters
1.示例代码 采用vue单文件组件,使用moment插件格式化日期 <template> <div> <h1>{{date | dateFormat}}</h ...
- struts2中Action訪问servlet的两种方式
一.IoC方式 在struts2框架中,能够通过IoC方式将servlet对象注入到Action中.通常须要Action实现下面接口: a. ServletRequest ...
- 在WebService中使用Microsoft.Practices.EnterpriseLibrary.Data配置数据库
1. 新建WebApplication1项目 1.1 新建—Web—ASP.NET Empty Web Application--WebApplication1 1.2 添加一个WebForm1 2. ...
- [Android Bug] ListView中Header, Footer无法隐藏(gone)的问题
ListView中Header.Footer View应该是会应该遇到, 比如说,滚动到底部时,自动开始加载: 对于一些应用市场,会在Header中加上ViewFlipper做应用推荐(滚动的那种,好 ...