首页 > 编程语言 >KMP算法

KMP算法

时间:2024-06-02 22:45:19浏览次数:13  
标签:const int 算法 Maxn KMP lb

KMP算法

KMP算法 是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法。

重点是找到字符串的最长公共前后缀。用最长公共前后缀在匹配的同时,实现快速跳转。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
const int Maxn = 1e6 + 5;

int la, lb;
int nxt[Maxn];
char a[Maxn], b[Maxn];

inline void kmp() { //字符串: 1 ~ lb;
	nxt[1] = 0;
	for (int i = 2, j = 0; i <= lb; i++) { // 求 nxt[1~lb]; nxt[i]为(包括第i位)最长公共前后缀;
		while (j && b[i] != b[j + 1]) j = nxt[j]; // 子问题思想,让模式串(b串)后移找到前缀,即 j=nxt[j];
		if (b[i] == b[j + 1]) j++; // 如果是因为 j==0 退出的 while循环,不执行 j++;
		nxt[i] = j;
	}
	for (int i = 1, j = 0; i <= la; i++) { // i是主串的指针,j是模式串的指针;
		while (j && a[i] != b[j + 1]) j = nxt[j]; // 匹配失败;
		if (a[i] == b[j + 1]) j++;			 // 匹配成功;
		if (j == lb) {
			printf("%d\n", i - lb + 1); // 找到出现的位置,实际上为 i-lb;
			j = nxt[j];
		}
	}
}

int main() {
	scanf("%s%s", a + 1, b + 1);
	la = strlen(a + 1);
	lb = strlen(b + 1);
	kmp();
	for (int i = 1; i <= lb; i++) printf("%d ", nxt[i]);
	return 0;
}

标签:const,int,算法,Maxn,KMP,lb
From: https://www.cnblogs.com/pengcheng-official/p/18227759

相关文章

  • 代码随想录算法训练营第二十一天 | 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众
    530.二叉搜索树的最小绝对差题目链接文章讲解视频讲解关键词:二叉搜索树-->中序遍历关于递归的返回值  由于需要遍历整棵二叉树,所以返回值为void,如果不是遍历整棵二叉树,需要在得到结果时立即返回结果,此时返回值才不为空怎样使用两个指针pre和cur使得pre始终指向cur的前......
  • 常见的排序算法——快速排序
    本文记述了快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想基于分治思想的快速排序,使用切分函数找到一个切分位置,保证其左侧子范围内的所有元素都不大于切分位置的元素,右侧子范围内的所有元素都不小于切分位置的元素。然后用递归调用......
  • MD5加密算法中的加盐值(SALT)简单理解
    MD5是一种广泛使用的加密散列函数,它可以产生一个128位(16字节)的哈希值,通常用一个32位的十六进制字符串表示。MD5的主要目的是确保数据的完整性,而不是用于安全加密。加盐(Salting)是一种安全措施,用于增强密码存储的安全性。在密码学中,加盐值是一个随机生成的数据片段,它与密码结......
  • sift算法实现指纹验证
     本代码将使用SIFT特征检测和FLANN匹配器来比较两枚指纹是否与模板指纹匹配。模板指纹需要匹配的指纹1.定义显示图像的函数importcv2defcv_show(name,img):cv2.imshow(name,img)cv2.waitKey(0)2.定义计算匹配点个数的函数defverification(src,mode......
  • 代码随想录算法训练营第二十天 | 654.最大二叉树 617.合并二叉树 二叉搜索树
    654.最大二叉树题目链接文章讲解视频讲解classSolution{public:TreeNode*constructMaximumBinaryTree(vector<int>&nums){returninorderTraversal(nums,0,nums.size()-1);}TreeNode*inorderTraversal(vector<int>&nums,intbegi......
  • python自然语言处理实战:核心技术与算法 (涂铭,刘祥,刘树春)高清电子版pdf下载百度云
    书:pan.baidu.com/s/1rOoEvizAhkQyF8xScVh51w?pwd=8onw提取码:8onw我的阅读笔记:Python基础:为了进行NLP任务,首先需要掌握Python编程语言的基础知识。文本预处理:这包括文本清洗(如去除标点、停用词、特殊字符等)、文本分词(如中文分词)、文本向量化(如词袋模型、TF-IDF、Word2Vec等)。......
  • 囚徒5.3_SSA_BP算法
    麻雀算法加上bp网络importnumpyasnpimporttensorflowastffromtensorflow.keras.datasetsimportmnistfromtensorflow.keras.utilsimportto_categoricalfromtensorflow.keras.modelsimportModelfromtensorflow.keras.layersimportInput,Conv2D,MaxPoolin......
  • 算法金 | 机器学习模型评价、模型与算法选择(综述)
    大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣][SebastianRaschka2018]ModelEvaluation,ModelSelection,andAlgorithmSelectioninMachineLearning,https://arxiv.org/abs/1811.12808摘要:本文主要讨论了模型评估......
  • 开源代码分享(32)-基于改进多目标灰狼算法的冷热电联供型微电网运行优化
    参考文献:[1]戚艳,尚学军,聂靖宇,等.基于改进多目标灰狼算法的冷热电联供型微电网运行优化[J].电测与仪表,2022,59(06):12-19+52.DOI:10.19753/j.issn1001-1390.2022.06.002.1.问题背景        针对冷热电联供型微电网运行调度的优化问题,为实现节能减排的目标,以微电......
  • [排序算法]冒泡排序+快速排序全梳理!
    目录前言一、冒泡排序基本思路图解冒泡代码实现代码优化冒泡排序的特性总结:二、快速排序1.hoare版本图解演示代码实现特性总结2.挖坑法基本思路图解过程代码实现特性总结3.前后指针法基本步骤图解过程代码实现特性总结4.快速排序的优化三数取中小区间优化5.非递归实......