简单kmp算法(poj3461)
题目简述:
给你两个字符串p和s,求出p在s中出现的次数。
思路简述:
在介绍看BF算法时,终于了解到了大名鼎鼎的KMP算法,结果属于KMP从入门到放弃系列,后来看了几位大神的博客,似乎有点懂了。此题为KMP算法的简单应用。
KMP简述:
BF算法为穷举法,而此法通过next数组的指引,巧妙的跳过了模式串即短的那串中几个不需要去比较的字符,实现效率的提高。next数组为模式串前后完全重复的最大子串,前串以第一个字母开
头,后串以所求数值的前一位为结束,重复最大子串中字母数量即next数组相应位置的值。还有一种可以优化的情况,下面的代码没写进去。百度
基础版代码:
#include <iostream>
#include <cmath>
#include<stdio.h>
#include <cstdio>
#include <cstring>
#include<algorithm>
using namespace std;
#define N 100010 char s[N * 10], p[N];//s为输入长的,p为短的
int nextval[N];
int lens, lenp; void getnext()//根据模式串得出next数组
{
int i = 0, j = -1;
nextval[0] = -1;//next数组最前面为-1
while (i != lenp)//当后搜索符未达到模式串即短的那串的结束
{
if (j == -1 || s[i] == s[j])//前搜索符刚刚开始搜索或前后搜索符对应字母相等时
nextval[++i] = ++j;//进行相应next的赋值
else
j = nextval[j];//前搜索符回到开始或已经得到的相应的next值,后搜索符不变
}
} int KMP()
{
int i = 0, j = 0, count = 0;
while (i != lens && j != lenp)//因为是要得到所有所处的位置
{
if (s[i] == p[j] || j == -1)//前搜索符刚刚开始搜索或前后搜索符对应字母相等时
++i, ++j;
else
j = nextval[j]; //前搜索符回到开始或已经得到的相应的next值,后搜索符不变
if (j == lenp)//当到达短的那串结尾时,说明一次完全匹配完成
{
count++;
j = nextval[j];//把前搜索符转到相应next值处
}
}
return count;
} int main()
{
int ncase;
int len;
int ans;
scanf("%d", &ncase);
while (ncase--)
{
scanf("%s %s", p, s);
lens = strlen(s);
lenp = strlen(p);
getnext();
ans = KMP();
printf("%d\n", ans);
}
return 0;
}
简单kmp算法(poj3461)的更多相关文章
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- KMP算法简单回顾
前言 虽从事企业应用的设计与开发,闲暇之时,还是偶尔涉猎数学和算法的东西,本篇根据个人角度来写一点关于KMP串匹配的东西,一方面向伟人致敬,另一方面也是练练手,头脑风暴.我在自娱自乐,路过的朋友别太认 ...
- KMP算法实践与简单分析
一.理解next数组 1.约定next[0]=-1,同时可以假想在sub串的最前面有一个通配符"*",能够任意匹配.对应实际的代码t<0时的处理情况. 2.next[j]可以 ...
- 运用kmp算法解决的一些问题的简单题解
学习kmp算法我最后是看的数据结构书上的一本教材学会的..我认为kmp相对于普通的BF算法就是避免了非常多不必要的匹配.而kmp算法的精髓自然就在于next数组的运用...而next数组简而言之就是存 ...
- KMP算法的一个简单实现
今天学习KMP算法,参考网上内容,实现算法,摘录网页内容并记录自己的实现如下: 原文出处: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93M ...
- KMP算法 C#实现 字符串查找简单实现
KMP算法 的C#实现,初级版本 static void Main(string[] args) { #region 随机字符 StringBuilder sb = new StringBuilder ...
- Linux GCC下strstr的实现以及一个简单的Kmp算法的接口
今天做了一道题,要用判断一个字符串是否是另一个字符串的子串,于是查了一下strstr的实现. 代码如下: char *strstr(const char*s1,const char*s2) { con ...
- KMP 算法简单解释
讲KMP算法,离不开BF,实际上,KMP就是BF升级版,主要流程和BF一样 不同是在匹配失败时能利用子串的特征减少回溯,利用根据子串特征生成的Next数组来减少 <( ̄︶ ̄)↗[GO!] ...
- KMP算法
KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...
随机推荐
- 2、CentOS下编译安装Python2.7.6(转)
CentOS系统下面Python在升级到2.7.6的时候,没有找到安装包直接安装,只能通过源代码编译的方式来安装Python 2.7.6版本.这篇是编译和安装Python2.7.6的过程记录. Cen ...
- 转载: http状态码
消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在 ...
- 【版本更新】开发工具DevExtreme发布v18.2.7|附下载
DevExtreme Complete Subscription是性能最优的 HTML5,CSS 和 JavaScript 移动.Web开发框架,可以直接在Visual Studio集成开发环境,构建 ...
- C语言关键字分类整理
C语言总览: 强类型,面向过程 简洁.灵活:32个关键字(C99标准新增5个,C11新增7个),9种控制语句,34种运算符 数据类型丰富,运算符丰富 结构化(控制语句).模块化(函数) 灵魂.特色:指 ...
- axis2设置soap1.1或soap1.2协议
现在Axis.Axis2都是同时支持SOAP1.1和SOAP1.2的.即在服务器端发布一个WebService服务之后,客户端既可以通过SOAP1.1版本来访问服务器的服务,也可以通过SOAP1.2版 ...
- Linux系统KVM虚拟化技术
在公司工作时出现了这样一个需求:需要在一台服务器中安装两个系统,分别部署不同的服务,设置不同的系统时间,并且两个系统之间可以互相通讯.在网上查询相关资料后,决定通过KVM实现该功能,现将步骤记录如下. ...
- Ubuntu + Nginx 配置全站https访问
最近跟室友要一起搞一个个人公众号,提前想把生态想清楚了,所以准备部署一个网站 正好公司有Microsoft Visual Studio Professional订阅,每个月有50刀免费额度,对于Azu ...
- Python 锁 同步 互斥锁
import time from threading import Lock,Thread num = 100 def f1(loc): loc.acquire() global num tmp = ...
- Java NIO 入门
本文主要记录 Java 中 NIO 相关的基础知识点,以及基本的使用方式. 一.回顾传统的 I/O 刚接触 Java 中的 I/O 时,使用的传统的 BIO 的 API.由于 BIO 设计的类实在太 ...
- git pull时报错:refusing to merge unrelated histories
在Github新建一个仓库,写了README文件,然后把本地一个写了仓库上传,首先pull,因为两个仓库不同,发现refusing to merge unrelated histories,无法pul ...