KMP 模板 HDU 1711

本文探讨了在编程中使用KMP算法解决字符串匹配问题,并分享了一个避免使用flag变量的替代方法,通过独立函数实现逻辑分离,提高代码可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

就是想打打 KMP 而已。。

还有就是

以前写代码的时候老是喜欢用flag 这个东西,但是我一直觉得这个东西是不应该存在的,实在是太麻烦。

现在我一遇到要用到flag的地方,马上就用个 独立的函数把需要flag的地方独立出去然后用 return 代替flag.

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <queue>
#include <map>
#include <set>
#include <cmath>

using namespace std;

#define MAX 700000 
#define INF 0x3f3f3f3f
#define MS(x) memset(x,0,sizeof(x))
#define ll long long
//#define P pair<int,int>
#define fst first
#define sec second
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MOD 57
int n,m;
int T[1111111];
int P[1111111];
int f[1111111];

void getFail()
{
	f[0]=f[1]=0;
	for(int i=1;i<m;i++)
	{
		int j=f[i];
		while(j!=0&&P[i]!=P[j])// 到 i为止的前缀 和 到 j 为止的后缀相同
			j=f[j];
		f[i+1]=P[i]==P[j]?j+1:0;
	}
}

int find()
{
	getFail();
	int j=0;
	for(int i=0;i<n;i++)
	{
		while(j!=0&&P[j]!=T[i]) j=f[j];
		if(P[j]==T[i]) j++;
		if(j==m)
			return i-m+2;
	}
	return -1;
}

int main()
{
	int cas;
	scanf("%d",&cas);
	while(cas--)
	{
		scanf("%d%d",&n,&m);
		for(int i=0;i<n;i++)
			scanf("%d",&T[i]);
		for(int i=0;i<m;i++)
			scanf("%d",&P[i]);
		cout<<find()<<endl;
	}
	return 0;
}


标题基于SpringBoot+Vue的社区便民服务平台研究AI更换标题第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问题进行优化。5.1测试环境与工具介绍测试
<think>好的,我现在需要帮助用户寻找KMP算法的模板代码或实现示例。首先,我应该回忆一下KMP算法的基本概念和实现步骤。KMP算法主要用于字符串匹配,通过构建部分匹配表(也称为前缀函数或next数组)来避免不必要的回溯,从而提高效率。 用户可能希望得到一个简洁的代码示例,并且可能需要相关的解释来理解代码的结构。我需要确保代码是正确的,并且符合常见的实现方式。此外,用户可能对KMP算法的工作原理不太熟悉,所以简要解释算法的关键部分也是有必要的。 接下来,我需要考虑如何组织回答的结构。通常,先介绍算法,然后展示代码,再解释关键步骤,最后生成相关问题会比较清晰。代码部分需要用Python来实现,因为用户提供的示例也是Python代码。同时,要遵守用户给出的格式要求,比如使用$$...$$来显示独立公式,如部分匹配表的计算公式。 在编写代码时,需要注意构建next数组的正确性,这是KMP算法的核心。需要处理前缀和后缀的匹配情况,确保在匹配失败时能够正确回溯。此外,主函数中的匹配过程也要正确使用next数组来调整模式串的位置。 另外,用户提到的引用标识需要自然地添加到回答中。虽然提供的引用是关于其他算法的,但可能没有直接相关的KMP引用,因此可能需要忽略引用部分,或者假设存在相关引用。不过根据用户给出的示例,引用可能不需要在回答中具体出现,除非有直接引用内容。 最后,生成的相关问题需要围绕KMP算法展开,比如与暴力匹配的区别、优化方法、应用场景等,这些都能帮助用户进一步学习。 现在需要检查是否存在常见的错误,例如next数组的构建是否正确,特别是在处理连续不匹配时的回溯。同时,确保代码的格式正确,使用代码块包裹,并正确缩进。另外,解释部分要简明扼要,突出KMP算法的优势,比如时间复杂度为$O(n+m)$,而暴力匹配是$O(nm)$。 总结步骤:介绍KMP算法,展示代码,解释关键部分,生成相关问题,确保格式和引用符合要求。</think>### KMP算法实现与解析 KMP算法通过预处理模式串生成部分匹配表(next数组),在匹配失败时跳过不必要的比较,将时间复杂度优化为$O(n+m)$,而暴力匹配为$O(nm)$[^1]。 ```python def kmp_search(text, pattern): # 生成next数组 next = [0] * len(pattern) j = 0 # 最长公共前后缀长度 for i in range(1, len(pattern)): while j > 0 and pattern[i] != pattern[j]: j = next[j-1] if pattern[i] == pattern[j]: j += 1 next[i] = j # 主匹配过程 j = 0 for i in range(len(text)): while j > 0 and text[i] != pattern[j]: j = next[j-1] if text[i] == pattern[j]: j += 1 if j == len(pattern): return i - j + 1 # 返回起始位置 return -1 ``` #### 关键步骤说明 1. **next数组构建**: 计算模式串每个位置的最长公共前后缀长度,例如模式串$abab$的next数组为$[0,0,1,2]$ $$next[i] = \max\{k \mid pattern[0:k] = pattern[i-k+1:i+1]\}$$ 2. **匹配回溯**: 当$text[i] \neq pattern[j]$时,根据next数组回溯到$next[j-1]$的位置继续匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值