ch 1809 kmp中f数组的应用

图解KMP算法,带你彻底吃透KMP KMP算法一直是一个比较难以理解的算法,本篇文章主要根据《大话数据结构》中关于KMP算法的讲解,结合自己的思考,对于KMP算法进行一个比较详细的解释。 阅读详情

在这里插入图片描述

思路:
搞了一天了,好累啊。
终于搞明白了这道题
就是kmp里面f[i]数组表示的是 :a串以i为结尾的字串,与b串的前缀的最大匹配长度。所以对于题上说的某些前缀,你不用管是那个前缀,你只需要知道前缀的匹配长度就行了啊,不过f[i]其实可以继续往后匹配,你直接算是不行的,所以cnt[i]数组应该保存的是匹配长度小于等于i的有多少种情况,所以for (int i = 1; i <= n; i++) cnt[f[i]]++;
不过有可能f[i]既可以匹配5位字符,又可以匹配3位字符,那么你就应该都算上去啊,所以cnt[i]数组应该保存的是匹配长度小于等于i的有多少种情况,但是你刚刚少算了一些情况的嘛,所以for (int i = n; i >= 1; i–) cnt[nn[i]] += cnt[i];
最后答案就是cnt[x]-cnt[x+1];

#include <cstdio>
#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <stack>

#define INF 0x3f3f3f3f
#define IMAX 2147483646
#define LINF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define uint unsigned int

using namespace std;

int n, m, q, nn[211111], f[211111],cnt[211111],tt;
char a[211111], b[211111];

int main() {
	scanf("%d%d%d", &n, &m, &q);
	scanf("%s%s", a + 1, b + 1);
	nn[1] = 0;
	for (int i = 2, j = 0; i <= m; i++) {
		while (j != 0 && b[i] != b[j + 1])j = nn[j];
		if (b[i] == b[j + 1])j++;
		nn[i] = j;
	}
	for (int i = 1, j = 0; i <= n; i++) {
		while (j != 0 && (j == m || a[i] != b[j + 1]))j = nn[j];
		if (a[i] == b[j + 1])j++;
		f[i] = j;
	}
	for (int i = 1; i <= n; i++) cnt[f[i]]++;
	for (int i = n; i >= 1; i--) cnt[nn[i]] += cnt[i];
	for (int i = 1; i <= q; i++) {
		scanf("%d", &tt);
		printf("%d\n", cnt[tt] - cnt[tt + 1]);
	}
	
	return 0;
}
KMP算法中的模式串移动数组 题目描述 字符串的子串定位称为模式匹配,模式匹配可以有多种方法。简单的算法可以使用两重嵌套循环,时间复杂度为母串与子串长度的乘积。而KMP算法相对来说在时间复杂度上要好得多,为母串与子串长度的和。但其算符比较难以理解。 在KMP算法中,使用到了一个next数组。这个数组就是在比较失配时母串指针不必回溯,而子串指针移动相应位置即可。我们给出书中next数组的算式表示以及算法,请你实现之。 阅读详情

相关推荐

AFC自动售检票系统与人工智能AI结合的关键应用方案

针对售检票、大客流管理、设备运维及服务优化提供了可落地的技术支持和实现细节,可作为地铁智慧交通项目的实践参考

leijinquan01的博客 1513

KMP算法总结

这学期学的串匹配算法,现在总结一下。 现在给出两个字符串。 S:ABACAACAD T:ACAD 这个算法可以用来求串S(主串)是否包含串T(模式串)。 》》》》1.首先对模式串求next[] 如果j从1开始标号:第一项就是0,第二项就是2。 如果j从0开始标号:第一项就是-1,第二项就是0。 T的长度为4,前两个

F_aF_a的博客 244

[AHK] 自动化获取通达信股票代码:从消息钩子到数据提取

本文详细介绍了如何使用AHK(AutoHotkey)通过Windows消息钩子技术自动化获取通达信股票代码,实现高效数据提取和交易自动化。文章涵盖消息机制原理、AHK脚本开发、性能优化及安全注意事项,为股票交易者提供了一套完整的解决方案。

weixin_42614269的博客 616

KMP算法(研究总结,字符串)

KMP算法(研究总结,字符串) 前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆。 引入 首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几个?为了方便叙述,我们先给定两个字符串的值 A="abcaabababaa" B="abab" 那么普通的匹配是怎么操作的呢? 当然就是一位一位地比啦。(下面用蓝色表示已经匹配,黑色表示匹配...

dipinzhu4111的博客 5242

Ubuntu20.04运行Vins-fusion

因已安装ROS noetic,eigen,opencv及ceres等库,这部分环境配置就不细讲,直接下载VINS-FUSION的代码库 下载编译 cd ~/vins-fusion/src git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git cd ../ catkin_make source ~/catkin_ws/devel/setup.bash 编译时会发现一堆错误,别急,无非就是环境冲突问题,一个个解决 1)首先,ROS

xiaojinger_123的博客 1万+

手把手教你用Simulink+CANoe+Carsim搭建硬件在环仿真环境(避坑指南)

本文是一份详细的硬件在环仿真环境搭建指南,重点讲解如何将Simulink、CANoe和CarSim三大工具进行实战融合。内容涵盖软件版本兼容性、授权避坑、环境配置,并分步演示了从离线联合仿真到实现软实时同步的完整流程,旨在帮助汽车电子工程师高效构建稳定的HIL测试平台。

weixin_29092579的博客 402

如果你看不懂KMP算法,那就看一看这篇文章( 绝对原创,绝对通俗易懂)

KMP算法,俗称“看毛片”算法,是字符串匹配中的很强大的一个算法,不过,对于初学者来说,要弄懂它确实不易。整个寒假,因为家里没有网,为了理解这个算法,那可是花了九牛二虎之力!不过,现在我基本上对这个算法理解算是比较透彻了!特写此文与大家分享分享!

zhangxin09的专栏 2844

Java课程设计——扫雷游戏程序

使用Java语言对扫雷游戏的复刻

m0_60671275的博客 3496

KMP题目分析与总结

前言本篇文章不阐述KMP算法流程与实现方式,网上有很多对KMP算法进行详细阐述的文章,至于KMP的实现方式,特别推荐刘汝佳版本的KMP算法,简单易懂且易于实现。 本篇文章主要针对常见的KMP问题进行剖析,提供一些思路供反思、参考、交流。KMP能够解决的问题KMP可以有效解决大部分单匹配问题,KMP算法的复杂度是O(M+N),这是十分高效的。KMP核心问题——F数组(NEXT数组)F数组是整个KMP

zhenlingcn的博客 1166

华为OD机试真题 新系统【小学英语老师批改作文】

华为OD机试 新系统真题【小学英语老师批改作文】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【小学英语老师批改作文】

qq_45776114的博客 922

【01】Python解释器的安装

工欲善其事必先利其器。君欲学PYthon,则必先安装Python解释器。安装过程相对简单,大致跟着如下步骤走即可。

侯小啾技术博客 1258

【CH1809】匹配统计(KMP)

题目链接 摘自https://www.cnblogs.com/wyboooo/p/9829517.html 用KMP先求出以a[i]为结尾的前缀与b匹配的最长长度。 比如 f[i] = j,就表示a[1~i]的后缀最多可以和b[1~j]匹配。但求出这个并不意味着以a[i]为开头的后缀可以和b恰好匹配j位(因为也许后面还可以匹配),但是可以肯定的是他至少可以匹配j位。我们很难求出恰好可...

weixin_30642267的博客 77

Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)

dpkt 是一个功能强大的 Python 网络数据包解析库,支持解析和构造以太网、IP、TCP/UDP 等多种协议的数据包。其核心功能包括解析各层协议头部、读写 pcap 文件、构造自定义数据包及分析 HTTP 流量等。dpkt 提供简单易用的 API,适用于网络分析、安全研究和流量监控场景。优化技巧包括数据包过滤、批量处理和选择性解析以提高性能,常见问题如数据不完整或协议识别错误可通过异常处理和字段验证解决。典型应用场景涵盖协议分析、网络调试和自定义数据包生成。

数据知道的博客 1万+

题解 CH1809 【匹配统计】

题目链接:Link Problem Solution 首先不难想到字符串Hash的做法,枚举A中的每个位置,二分匹配长度即可,时间复杂度\(O(n)\)。 很明显正解应该要用KMP,但对于匹配出的一个f[i]我们只能知道“有一次长度至少为f[i]的匹配”,同时还可能会漏掉一些匹配位,怎么办? 基于值域的前缀和 即令cnt[x]=长度至少为x的匹配位的个数,易得答案等于cnt[x]-cn...

donglaishi1835的博客 366

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

CH1809匹配统计【KMP】

1809 匹配统计0x18「基本数据结构」练习 描述 阿轩在纸上写了两个字符串,分别记为A和B。利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度。 不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x。 例如...

weixin_30765475的博客 230

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Next数组(F数组)

Next数组(F数组)

qq_42218220的博客 387

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

01背包问题【f [i][j] 为剩余空间情况——数组实现】

有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。 接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。 输出格式 输出一个...

命z的博客 531

一次搞懂KMP算法

最近又复习了下KMP算法,有些东西长久不用还是会忘。百度了很多,终于找到了一篇思路比较清晰,讲解中能突出重点的帖子: https://blog.youkuaiyun.com/f1033774377/article/details/82556438 总结一下,算法中的几个重点,以作备忘。其中的F数组即next数组: F数组:数组索引对应模式字符串的索引,元素值“0到索引值位置”子串的最长前缀结束字符的索引位置。如模式字符串“abacd”,F(2)=0,即0~2这部分子串,其最长前缀的结束字符位置为0,也就是子串"a",

硕硕的博客 289

HDU 2594 Simpsons’ Hidden Talents (KMP的F数组应用)

KMP中f数组意义:对于模式串的前i个字母构成的子串,这个子串会有一些前缀和后缀完全相同(包括长度),f[i]表示的就是这个最大的长度,而长度确定了前缀后缀就确定了。 对于这个题,如果将s1,s2连接成一个串c,c的长度为lc,那么f[lc]就是题目中要求的最大长度。 注意如果f[lc]大于la或lb,那么要修改成la和lb中的最小值lmin,至于为什么一定存在长度为lmin的相同前后

Baoli1008的专栏 454

kmp数组求法

1.next求法 例如s=‘abcac’,首先从第一位a开始,设置a为0(如果是-1,后面的都不需要+1),第二个是b,b的前面子串是a,没有匹配的设置成0+1,接下来是c,前面子串是ab,同理设置为0+1,下一个a也是0+1,最后是c,前面子串是abca,他的前缀子串a和后缀a相等,设置成1+1,所以next={0,1,1,1,2} 2.nextval求法 例如,s=‘aaaab’,next={0,1,2,3,4,},第一个是a,i=0,设置naxtval=0,i++.第二个是a与第一位相同,设置next

qq_42186444的博客 457

KMP算法详解(next数组详解)

KMP算法的关键是它的next数组,利用next数组能够高效地确定在当前失配的情况下,应当将模式串移动多少位才能够避免不必要的匹配。 我们要计算一个长度为m的转移函数next。 next数组的含义就是一个固定字符串的最长前缀和最长后缀相同的长度。 所以当不匹配时,我们直接令当前子串的下标j=next[j]即可,省去了不必要的匹配 比...

weixin_30871293的博客 1425

KMP算法 Next数组详解(【洛谷3375】KMP字符串匹配 )

KMP算法题面题目描述如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。为了减少骗分的情况,接下来还要输出子串的前缀数组next。如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。 输入输出格式输入格式:第一行为一个字符串,即为s1(仅包含大写字母)第二行为一个字符串,即为s2(仅包含大写字母)输出格式:若干行,每行包含一个整数,表示s2在s1中出

小蒟蒻yyb的博客 2万+

KMP算法详解

KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。但是相较于其他模式匹配算法,该算法晦涩难懂,第一次接触该算法的读者往往会看得一头雾水,主要原因是KMP算法在构造跳转表next过程中进行了多个层面的优化和抽象,使得KMP算法进行模式匹配的原理显得不那么直白。本文希望能够

joylnwang的专栏 21万+

KMP的next数组求法详解

部分参考了  BLOG kmp算法的精髓就在于next数组,从而达到跳跃式匹配的高效模式。 而next数组的值是代表着字符串的前缀与后缀相同的最大长度,(不能包括自身)。 "前缀"指除了最后一个字符以外,一个字符串的全部头部组合; "后缀"指除了第一个字符以外,一个字符串的全部尾部组合。 这里举个例子:     这样我们就求出来了next数组 模式串t ...

yutong5818的博客 5万+

CH1809 匹配统计 KMP

题目链接 http://noi-test.zzstep.com/contest/0x18%E3%80%8C%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E3%80%8D%E7%BB%83%E4%B9%A0/1809%20%E5%8C%B9%E9%85%8D%E7%BB%9F%E8%AE%A1 分析 求恰好匹配 xxx 长度比较困难,可...

Kevin的博客 525
上一篇: ch 1807 最小表示法模板题
下一篇: poj 1442 优先队列
FawkesLi
博客等级 码龄8年 21粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值