简单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的原理其实很简单,给定一个字符串和一个模式串 ...
随机推荐
- Visual Studio 2017 离线安装包
vs_community.exe --layout D:vs2017offline-en --add Microsoft.VisualStudio.Workload.ManagedDesktop -- ...
- react-native 安装的时候遇到的问题
JAVA JDK必须要版本8以上(卡了我好大一会,不要忘了环境变量换成8的路径) 这个报错是因为我的版本没升级? 总之解决方法如下 给升级下就好啦~ 然后出现个这么个问题,是因为我用的测试手机是红米 ...
- Quartz 2.2 动态添加、修改和删除定时任务
QuartzManager.Java 动态添加.修改和删除定时任务管理类 import org.quartz.CronScheduleBuilder; import org.quartz.CronTr ...
- Excel--------实用功能(数据对比)
--excel数据在sql中查询展示出来 SELECT * FROM (SELECT '101001' as code ,'上海宝山站' as name union allSELECT '102083 ...
- Java NStruct
package org.rx.bean; import org.rx.Lazy; import org.rx.SystemException; import java.io.Serializable; ...
- linux安装Django 以及 生产环境部署实现高并发
1.首先安装python Python编译安装 主要介绍linux环境下安装 cd /usr/local/src //进入安装目录 wget https://www.python.org/ ...
- 制作voc2007数据格式的数据集
最近按照博主分享的流程操作,将自己遇到的难题记录下来,附上原博文链接:https://blog.csdn.net/jx232515/article/details/78680724 使用SSD训练自己 ...
- windows下安装memcached,报错:Failed to ignore SIGHUP RESULT too large
小平板不想装虚拟机, 但是却跑不起memcached 网上虽有解决方案,但都只有一条命令, 没有出处. 翻了半天, 找到这个连接 https://commaster.net/content/insta ...
- find a lover
#version_s#1.8#version_e# #update_s#https://files.cnblogs.com/files/dyh221/update_1.zip#update_e#
- 如何保证WebBrowser一直在页面内跳转
目前在编写一个小工具,用到了WebBrowser,在调试时点击页面内连接自动打开ie跳转,所以百度查找解决办法. private void webBrowser1_NewWindow(object s ...