首页 > 其他分享 >$KMP$学习记

$KMP$学习记

时间:2024-04-27 16:11:58浏览次数:22  
标签:lenb int KMP 学习 kmp pi 失配

《不浪漫罪名》

没有花
这刹那被破坏吗
无野火都会温暖吗
无烟花一起庆祝好吗
若爱恋
仿似戏剧那样假
如布景一切都美化
连相拥都参照主角吗
你说我未能定时
令你每天欢笑一次
我没说出一句美丽台词
是你心中一种缺陷定义
流进了眼角里的刺
为何不浪漫亦是罪名
为何不轰烈是件坏事情
从来未察觉我每个动作
没有声都有爱你的铁证
为何苦不浪漫亦是罪名
为何总等待着特别事情
从来未察觉我语气动听
在我呼吸声早已说明
什么都会用一生保证


KMP学习记

时更。


关于前缀

一个在\(kmp\,\)中较重要的思想。

定义:

一个长度为\(n\,\)的字符串,它的前缀为$$s_1,s_1s_2,···,s_1s_2 ······s_n $$

后缀同理。

真前/后缀即去掉原字符串其他的前缀。

对于一个字符串,它的前缀函数\(\pi [i]\)为\(s_1···s_i\,\)中最长的相等的真前缀和真后缀的长度。

abcabd(下标从1开始)

\(\pi[1]=0\);

\(\pi[2]=0\);

\(\pi[3]=0\);

\(\pi[4]=1\,\),aa

\(\pi[5]=2\,\),abab

\(\pi[6]=0\)。

求解:

暴力做法,复杂度\(O(n^3)\):

for(int i=2;i<=len;i++)
{
	for(int j=i;j>=1;j--)
	{
		if(s.substr(0,j)==s.substr(i-j+1,j))
		{
			pi[i]=j;
			break;
		}
	}
}
优化

摆了,贴上JD的博客

image

image

KMP板子

题链

思路

KMP的精髓在于,对于每次失配之后,我们不会从头重新开始枚举,而是根据我们已知的数据,从某个特定的位置开始匹配。

而对于模式串的每一位,都有唯一的特定变化位置,这个在失配之后的特定变化位置可以帮助我们利用已有的数据不用从头匹配,从而节约时间。

具体例子可以自己手搓一个。

两个关键点:

1.我们的失配数组应当建立在模式串意义下,而不是文本串意义下。因为显然模式串要更加灵活,在失配后换位时,可以更灵活简便地处理。

2.移位法则:在模式串\(s\)中,对于每一位\(si\) ,它的\(kmp\)数组应当是记录一个位置 \(j\),\(j \leq i\)并且满足\(s_i=s_j\),并且在\(j!=1\)时满足\(s_1\)至\(s_{j-1}\)分别与\(s_{i-j+1}\)~\(s_{i-1}\)按位相等。

代码

const int Ratio=0;
const int N=1000005;
char a[N],b[N];
int lena,lenb,kmp[N];
namespace Acheron
{
	void Akmpprepare()
	{//kmp-即失配回跳到哪个位置的数组-初始化 
		int j=0;
		fo(i,2,lenb)
		{
			while(j&&b[i]!=b[j+1])//模式串自配 判0:回跳到头 
				j=kmp[j];
			if(b[j+1]==b[i])
				j++; 
			kmp[i]=j;
		}
	}
	void Akmpwork()
	{
		int j=0;
		fo(i,1,lena)
		{
			while(j>0&&b[j+1]!=a[i])//失配回跳 
				j=kmp[j];
			if(b[j+1]==a[i])//匹配成功:对应模式串位置+1 
				j++;
			if(j==lenb)
			{
				printf("%d\n",i-lenb+1);
				j=kmp[j];
			}
		}
	}
	void Aput()
	{
		fo(i,1,lenb)
			qkg(kmp[i]);
	}
}
int main()
{
	scanf("%s%s",a+1,b+1);
	lena=strlen(a+1),lenb=strlen(b+1);
	Acheron::Akmpprepare();
	Acheron::Akmpwork();
	Acheron::Aput();
	return Ratio;
}

$Updating...$

image

标签:lenb,int,KMP,学习,kmp,pi,失配
From: https://www.cnblogs.com/Ratio-Yinyue1007/p/18162175

相关文章

  • Ubuntu学习笔记
    1.    Adduser创建普通用户,并赋予sudo角色管理权限CyberArk连接机器后执行下面的命令创建新账号1)adduserXXX,  -XXX代表账号名称2)adduserXXXsudoorsudousermod-aGsudoXXX      新创建账号XXX添加到sudo组,授予sudo管理权限权限3)getentgroupsudo......
  • MySQL学习之explain
     from之后的查询得到的表叫做衍生表,是临时表数据,生成临时表之后的数据是无法使用索引的,如果数据量大查询效率就会比较低,这就是查询要尽量少使用子查询这些临时表。  explain详解id:表示查询序号,也可以表示优先级;当值都不一样的时候,值越大表示优先级越高,越先执行;当值都一......
  • ROS学习-启动服务端错误debug
    ros2runexamples_rclpy_minimal_serviceservice输入这个命令用于运行服务节点,这个服务的功能是将两个数字相加,给定a,b两个数,返回sum也就是ab之和。报错:2024-04-2713:11:39.105[RTPS_TRANSPORT_SHMError]Failedinit_portfastrtps_port7412:open_and_lock_filefailed->......
  • ROS学习--添加依赖相关问题
    在自定义话题接口时,步骤如下:新建msg文件夹,并在文件夹下新建xxx.msg在xxx.msg下编写消息内容并保存在CmakeLists.txt添加依赖和msg文件目录在package.xml中添加xxx.msg所需的依赖编译功能包即可生成python与c++头文件其中在CmakeLists.txt中添加依赖和msg文件目录时需要将......
  • 卡诺图学习
    目录1、最小项2、最小项与卡诺图之间转换卡诺图根据最小项填写卡诺图根据逻辑函数填写卡诺图3、卡诺图化简方法1、最小项逻辑函数表达式可以使用其最小项相加来表示最小项的定义一个函数的某个乘积项包含了函数的全部变量,其中每个变量都以原变量或反变量的形式出现,且仅出......
  • 芯科SiWx917学习笔记:1-测试Out of Box Demo
    实验目的:测试OutofBoxDemo实验环境:SimplicityStudioV5实验器材:WirelessStarterKitMainboard(BRD4002ARevA06)+ SiWG917SingleBandWi-FiandBLE8MBFlashRadioBoard(BRD4338ARevA01)实验开始:1.新建工程:在demos中找到OutofBoxDemo(SoC)应用演示工程......
  • ROS2学习-节点名随记
    1.节点名定义:主函数中的node=WriterNode("he")定义了该节点的名称defmain(args=None):"""ros2运行该节点的入口函数,可配置函数名称"""rclpy.init(args=args)#初始化rclpynode=WriterNode("he")#新建一个节点rclpy.spin(nod......
  • LLM学习(5)——系统评估与优化
    5.1如何评估LLM应用5.1.1验证评估的一般思路通过不断寻找BadCase并进行针对性优化,将这些案例逐步加入验证集,形成一个具有一定样本数量的验证集。针对这种验证集,逐个进行评估变得不切实际,需要一种自动评估方法来对整体性能进行评估。验证迭代是构建以LLM为核心的应用程序的......
  • ROS1学习记录(14.0)(古月ROS入门终章:怕什么真理无穷,进一寸有进一寸的欢喜)
    学习视频:21.课程总结与进阶攻略_哔哩哔哩_bilibili   机械臂:     机器人深入书籍:机器人学导论(推荐)   ......
  • ROS1学习记录(13.0)
    学习视频:20.常用可视化工具的使用_哔哩哔哩_bilibili 打开roscore核心先跑起来,再开海龟仿真器,对于qt指令可视化运行可以查看全部指令,方法就是输入rqt_再按两下tab就好先用rqt_console看看,输出日志信息出现问题就会发出一些日志,比如下面的撞墙 下面的HighlightMessages......