KMP基础模板- - -看了很多人的模版,总结一下

【算法模板】KMP算法 简述 KMP算法:由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,串匹配算法,一般串都是指字符串。KMP是基于双指针算法的 应用:一个字符串在另外一个字符串中出现的位置和 循环节 一般地,被匹配的字符串叫主串,用来匹配主串的叫模式串 如果我们不用KMP,来查找一个字符串在另外一个字符串中第一次出现的位置,暴力求解时间复杂度是O(NM),用KMP优化查询时间复杂度是O(1),但是空间复杂度是O(N)。M和N分别是模式串和字串的大小。 KMP讲解 我觉得MOOC浙江大学数据结构讲的很不错, 阅读详情

KMP看了好久都没看懂,觉得看懂之后自己写了个求Next数组的程序,还是一直无限输出-1。无奈只能继续搜寻大神的代码和思路,

才终于把最基础的查询下标和出现次数问题给解决了,太弱了~_~

经过我认真总(抄)结(袭)的代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 111111;
char s1[MAXN],s2[MAXN];
int Next[MAXN+5];
int lens1,lens2;//还是定义全局变量吧,不知道为什么直接用strlen函数的时候会出错,改成全局变量就对了
void GetNext(int len)//求Next数组,虽然不懂,但就这几行代码,写着写着就背下来了=_=!
{
	Next[0]=-1;
	int left=-1,right=0;
	while(right<len)
	{
		if(left==-1 || s2[left]==s2[right])//这里是求模式串的Next数组,不要写成了两个不同的字符串比较了=_=		
			Next[++right]=++left;
		else left=Next[left];
	}
//	for(int i=0;i<len;i++)
//	printf("%d ",Next[i]);
//	printf("\n");
}
void Index_KMP()
{
	GetNext(lens2);
	int left=0,right=0;//left是主串下标,right是模式串下标
	while(left<lens1&&right<lens2)
	{
		if(s1[left]==s2[right]||right==-1)//注意是right等于-1时进来,因为left表示的是主串的下标,防止了回溯,不会减少
		{
			left++;
			right++;
		}			
		else right=Next[right];//利用Next数组防止left回溯			
	}
//	printf("%d\n",right);
//	printf("The lenth of s1 is: %d\n",strlen(s1));
//	printf("The lenth of s2 is: %d\n",strlen(s2));
	if(right==lens2)
		printf("s2在s1中第一次出现的下标为: %d\n",left-lens2);
	else printf("-1\n");
	return;
}
void Count_KMP()
{
	if(lens1==1&&lens2==1)//特判长度为1的情况
	{
		if(s1[0]==s2[0])
			printf("1\n");
		else printf("-1\n");
		return;
	}
	int left=0,right=0,count=0;
	while(left<lens1)
	{
		if(right==-1||s1[left]==s2[right])//这里是模式串和主串比较,区分求Next数组时的判断条件
		{
			left++;
			right++;
		}else right=Next[right];
		if(right==lens2)count++,right=Next[right];
	}
	printf("s2在s1中出现的次数为: %d\n",count);
	return;
}
int main()
{
	while(~scanf("%s%s",s1,s2))	
	{
		lens1=strlen(s1);//主串
		lens2=strlen(s2);
		GetNext(lens2);
		Index_KMP();
		Count_KMP();
	}			
	return 0;
} 

利用上面的Count_KMP( )函数可以解决HUD1686,稍做修改就可以解决HDU2087,给出链接: HDU1686-Oulipo        HDU2087-剪花布条

好吧,其实我就是看的kuangbin的模板: kuangbin的KMP模板

KMP算法模板 KMP模板 ======================================================================== 立即下载

相关推荐

数据字典实战:如何用Excel快速搭建你的第一个数据字典(附模板下载)

本文针对中小团队在软件开发中面临的术语不一致问题,提供了一套使用Excel快速搭建数据字典的实战指南。文章详细讲解了核心字段设计、填充示例、高阶技巧及团队协作维护流程,旨在通过这一轻量级工具统一团队共识、提升开发效率,并附有实用模板下载。

weixin_29303701的博客 380

【算法】KMP模板(C++)

C++实现基础KMP匹配算法模板

xhd0728的博客 3010

常见信号逻辑电平标准介绍:TTL、CMOS、ECL、LVDS、CML

逻辑电平是指数字信号电压的高、低电平,相关参数定义如下:(1)输入高电平门限Vih:保证逻辑门的输入为高电平时所允许的最小输入高电平,当输入电平高于Vih时,则认为输入电平为高电平;(2)输入低电平门限Vil:保证逻辑门的输入为低电平时所允许的最大输入低电平,当输入电平低于Vil时,则认为输入电平为低电平;(3)输出高电平门限Voh:保证逻辑门的输出为高电平时的输出电平的最小值,逻辑门的输出为高电平时的电平值都必须大于此Voh;

liuchj的博客 1万+

kmp算法模板

KMP算法是一种时间复杂度为O(m+n)的字符串匹配算法,其中m和n分别为模式串和文本串的长度。其主要思想是利用已匹配到的前缀信息,避免在匹配过程中重复地搜索已经比较过的字符。具体实现需要用到getNext函数来求出模式串的next数组,kmp_search函数用于搜索模式串在文本串中的位置,并返回匹配的位置下标。

m0_73635448的博客 771

STM32F4_LCD显示汉字

LCD显示汉字和显示图片、数字、字符的原理是一样的,都是将汉字、图片、数字以及字符转换点阵,进而通过函数扫描点阵在LCD上显示;

light_2025的博客 1万+

肿瘤基因组分析实战:VAF、MAF、CCF这些指标到底怎么算?(附Python代码示例)

本文通过Python代码示例,详细解析了肿瘤基因组分析中VAF、MAF和CCF三大核心指标的计算逻辑与应用。文章从VCF文件解析入手,逐步演示了变异等位基因频率、次等位基因频率及癌细胞分数的计算方法,并探讨了拷贝数变异对结果的影响及克隆结构推断的实战流程,为生物信息分析提供实用指南。

silver的专栏 1005

KMP模板

KMP模板 next数组 习题

水深00安东尼的博客 450

基于STM32设计的消防小车

当前基于STM32单片机设计了一款智能消防小车;当前小车支持烟雾浓度检测、可燃气体检测,环境温度湿度检测、火焰源检测、能支持远程遥控,方便消防员远程操控进行灭火。小车也支持自动消防,在行驶过程中,消防智能小车通过火焰传感器感应火源以检测火焰具体位置,可以利用算法设计进行循迹灭火,该模式下驱动电机水泵喷水,可以有效控制火源的第二次发生,从而完成消防作业。小车本身带了超声波测距模块,红外壁障模块,在自动或者手动控制行驶过程中可以防止碰到障碍物损伤小车。

7375

[kmp+模板] kmp模板

文章目录0. 前言1. kmp 0. 前言 kmp 模式匹配算法很牛,一般结合 kmp 的题目都不怎么简单,或是困难题目可以采用 kmp 的思想很快搞定,之前博文有写过 kmp· 算法原理,和简单实现了下,但是由于当时认识浅薄,大家看看就好。在此总结一个简单的 kmp 算法模板。 当时的博文:[杂谈] 12. BF、KMP、RK Algorithm 字符串匹配算法 1. kmp 这里是拿数组模拟栈。 模板代码: #include <iostream> using namespace std;

Y-puyu 的博客 1892

一文速览:大模型语料构建与基础训练全流程实战指南

因为模型只有看到足够丰富、高质量的数据,才能真正学到“真本事”,展现出更强大的泛化能力,也就是能够在全新的场景和任务下,做出准确的推理和判断。我们日常做饭的时候,通常会先把买回来的菜仔细清洗干净,把坏掉的叶子、泥土、杂质等去除掉。同理,训练大模型的数据就像我们的食材,如果不干净,就会影响模型的学习效果,甚至训练出逻辑紊乱的模型。在大模型的世界里,有一句名言:“Garbage in, Garbage out”,翻译过来就是“垃圾输入,垃圾输出”,说白了,就是给模型喂的是什么数据,它学到的就是什么知识。

master_hunter的博客 1667

《网络安全自学教程》- Nmap使用及扫描原理分析

使用Nmap进行端口扫描、主机发现、服务识别、操作系统识别、指定脚本、结果导出文件,使用wireshark抓包分析扫描原理。

wangyuxiang946的博客 1万+

KMP模板(C++)

这是一个KMPC++的模板。相信很对同学看了大佬超详细的讲解(本文有链接),但还是不太清楚next数组的意义,或者为什么next[0]=-1,而不是1。Kmp的时间复杂度为什么是线性的

卖炫迈的小男孩的博客 7382

中国国家级地面气象站基本气象要素日值数据集(V3.0)

气温数据TEM, 包括站点编号(sid), 纬度(lat), 经度(long), 高程(elev), 年(year), 月(month),日(day), 平均气温(tmean), 最高气温(tmax), 最低气温(tmin)气压数据PRS, 包括站点编号(sid), 纬度(lat), 经度(long), 高程(elev), 年(year), 月(month),日(day), 平均气压(pmean), 最高气压(pmax), 最低气压(pmin)中国国家级地面气象站基本气象要素日值数据集(V3.0)

J_Giser的博客 3890

【算法模版】kmp

kmp函数:设置双指针i,j初始指向0,若ij对应的主串和子串字符匹配,同时移动ij一步,否则将j next映射一次(子串先和发生不匹配的位置对齐,再通过j对应的next向左移动对应步数),若ij任何一个移出字符串就停止,说明此时是。移动,若不是刚开始且ij指向的字符不相等,就不断移动j到next[j-1],若ij指向的字符相等,就j++,移动,若不是刚开始且ij指向的字符不相等,就不断移动j到next[j-1],若ij指向的字符相等,就j++,next:下标对应的最长公共前后缀,是对于从当前下标字母的。

aA467646767的博客 355

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

KMP详细解释及KMP算法模板

KMP是什么,KMP解决什么类型的问题 KMP全称为Knuth Morris Pratt算法,是一种高效的字符串匹配算法,寻找一个字符串中是否包含另一个字符串,例如 char *s = "ababababcab"; char *p = "ababc"; s为模板串(主串),p为字串,在s中找到p的位置 ...

zhbbbbbb的博客 3293

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

kmp模板

关于KMP算法的思想,网上有很多,这个算法写起来简单,但理解起来还是有一定难度的,我的表达能力也说不清楚, 所有直接上我自己写的模板吧 #include #include using namespace std; void get_next(char* p, int* next) { int i, j; i = 0; j = -1; next[0] = -1; while

3127

kmp 字符串hash Manacher模版

本文介绍了三种常见的字符串处理算法:KMP、字符串哈希和Manacher。KMP算法用于高效匹配模式串与主串,时间复杂度为O(N),通过预处理模式串生成next数组来优化匹配过程。字符串哈希算法通过将字符串映射为数字来简化匹配问题,常用于快速比较字符串片段。Manacher算法则用于在O(N)时间内找到字符串中的最长回文子串,通过预处理字符串并利用回文对称性来减少计算量。每种算法都提供了代码模板和相应的练习题,帮助理解和应用这些算法。

小圆的博客 463

几道KMP模板题

几道KMP的模板题 记录下KMP学习过程 注意:这里的模板s1是文本串s2是匹配串(模式串) HDU1711 Number Sequence链接 最小匹配位置 #include<iostream> #include<bits/stdc++.h> #include<queue> #include<vector> using namespace std; typedef long long ll; const ll maxn=1e6+5; const ll MOD

weach的博客 364

【模板】kmp以及扩展kmp

kmp算法: 最佳博客: http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html  ; 这里面kmp算法讲的比较详细,我主要在这写下自己的kmp模板以及需要注意的地方。 void getnext(int t) { int i=0,j=-1; while(i!=t) { if(j==-1||a

ten_three 1051

KMP模板和模板题目

package 算法模板; import java.util.*; public class KMP { public static void prefix_table(char pattern[],int prefix[],int n) {//找到表 prefix[0] = 0; int len = 0; int i = 1; while(i<n) { if(pattern[i] == pattern[len]) { len++; prefix[i]=len;

nankes的博客 198

字符串处理、KMP模板:【模板】

KMP算法模板(next函数和kmp) 首先主要感谢一下:July算法从头到尾彻底理解KMP,讲得是究极详细,文底还有视频版讲解。还有河海大学ACM字符串专题讲解,两个小姐姐一真一假让我笑哭,文章中我主要用了这个视频里的模板,很好用,自己手模上三五遍也就懂得差不多了。 ...

EP的别三日 283

[c++模板] KMP

给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。 模板串P在模式串S中多次作为子串出现。 求出模板串P在模式串S中所有出现的位置的起始下标。 输入格式 第一行输入整数N,表示字符串P的长度。 第二行输入字符串P。 第三行输入整数M,表示字符串S的长度。 第四行输入字符串S。 输出格式 共一行,输出所有出现位置的起始下标(下标从0开始计数),整数之间...

Tizzi的博客 522
上一篇: 用C / C++ 实现快速排序
下一篇: HDU1213-How Many Tables 并查集
P_rogrammer
博客等级 码龄12年 0粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值