【Week15作业 C】ZJM与纸条【KMP】

2023-05-16

题意:

ZJM 的女朋友是一个书法家,喜欢写一些好看的英文书法。有一天 ZJM 拿到了她写的纸条,纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物。ZJM 想知道自己收到的礼物是不是就是她送的,于是想看看自己收到的礼物在纸条中出现了多少次。

第一行输入一个整数代表数据的组数
每组数据第一行一个字符串 P 代表 ZJM 想要的礼物, 包含英语字符 {‘A’, ‘B’, ‘C’, …, ‘Z’}, 并且字符串长度满足 1 ≤ |P| ≤ 10,000 (|P| 代表字符串 P 的长度).
接下来一行一个字符串 S 代表 ZJM 女朋友的纸条, 也包含英语字符 {‘A’, ‘B’, ‘C’, …, ‘Z’}, 满足 |P| ≤ |S| ≤ 1,000,000.

输出一行一个整数代表 P 在 S中出现的次数.


思路:

使用KMP算法来求解,KMP是在暴力匹配算法的基础上进行优化的算法,它跳过了那些绝不可能成功的字符串比较。
令Next[i]的值是使得P[0…i]这一个子串的K-真前缀等于K-真后缀的最大的K。那么如果在P[r]失配,那么对于P[0…r-1]这一段,前Next[r-1]个字符一定和后Next[r-1]个字符相等,可以拿长度为Next[r-1]的前缀来替代当前的后缀,让P[Next[r-1]]这个字符对准刚刚失配的位置,从而跳过不可能成功的字符串比较。
接下来要求Next数组。显然Next[0]=0,要递推计算Next数组,即已知Next[0…x-1],求Next[x]。简记Next[x-1]为now,共有两种情况:情况1,P[x]=P[now],说明P[0…x]相等的前后缀是字符串P[0…x-1]加上P[x],即Next[x]=now+1;情况2,P[x]!=P[now],尝试缩短now,但仍要保证对于P[0…x-1]而言,它的now-真前缀等于now-真后缀,即now=Next[now-1]。


总结:

一道KMP算法求解字符串问题,需要好好理解一下KMP算法。这道题用G++可能会T,但相同代码用C++就能A,很神奇。


代码:

#include <iostream>
#include <string>
using namespace std;

int zs;
int Next[10010];
void getNext(string ptr)
{
	Next[0]=0;
	for(int i=1,j=0;i<ptr.size();i++)
	{
		while(j&&ptr[i]!=ptr[j])
			j=Next[j-1];
		if(ptr[i]==ptr[j])
			j++;
		Next[i]=j;
	}
}
int KMP(string str,string ptr)
{
	int cnt=0;
	getNext(ptr);
	for(int i=0,j=0;i<str.size();i++)
	{
		while(j&&str[i]!=ptr[j])
			j=Next[j-1];
		if(str[i]==ptr[j])
			j++;
		if(j==ptr.size())
		{
			cnt++;
			j=Next[j-1];
		}
	}
	return cnt;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>zs;
	string s1,s2;
	while(zs--)
	{
		cin>>s1>>s2;
		int ans=KMP(s2,s1);
		cout<<ans<<endl;
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Week15作业 C】ZJM与纸条【KMP】 的相关文章

  • 数据结构串的基本操作及KMP算法

    将串的基本操作C语言实现 xff0c 实现KMP算法算出NEXT函数和NEXTVAL的值 SqString h的基本内容 span class hljs keyword typedef span span class hljs keywor
  • Week15 实验

    A Q 老师的记录册 Problem Statement Q 老师有 N 个学生 xff0c 每个学生都有各自独立的编号 xff0c 且编号范围在 1 N 之间 这一天 xff0c 所有学生都在不同的时间进入教室 Q 老师记录了当编号为 i
  • A - ZJM 与霍格沃兹 (Week15 作业)

    A ZJM 与霍格沃兹 Sample Input expelliarmus the disarming charm rictusempra send a jet of silver light to hit the enemy tarant
  • KMP算法

    一 何谓模式串匹配 模式串匹配 xff0c 就是给定一个需要处理的文本串 xff08 理论上应该很长 xff09 和一个需要在文本串中搜索的模式串 xff08 理论上长度应该远小于文本串 xff09 xff0c 查询在该文本串中 xff0c
  • 【ZJM要抵御宇宙射线】CSP模测T2

    题目 题目大意 本题给出平面二维坐标上的若干个点 xff0c 要求选取一个点做圆心 xff0c 此时可以以最短半径包含所有点 xff0c 求出圆心坐标和最短半径平方 xff0c 结果保留两位小数 解题思路 本题乍看只下可能觉得会很复杂 xf
  • ZJM 与纸条

    ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物 ZJM 想知道自己收到的礼物是不是就是她送的 xff0c 于是想
  • 【Week15作业 C】ZJM与纸条【KMP】

    题意 xff1a ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物 ZJM 想知道自己收到的礼物是不是就是她送的
  • 模拟题【Week15实验】

    A题 题意 xff1a Q 老师有 N 个学生 xff0c 每个学生都有各自独立的编号 xff0c 且编号范围在 1 N 之间 这一天 xff0c 所有学生都在不同的时间进入教室 Q 老师记录了当编号为 i 的学生进入教室时 xff0c 教
  • hdu 1358 Period KMP

    题目大意 xff1a 对于一个字符串 xff0c 找由循环字符串组成的位置 xff0c 并输出最多循环了几次 xff0c 比如两个样例 xff0c 第一个是 aaa xff0c 所以在第二个位置由子串a循环两次得到 xff0c 第三个位置由
  • Cyclic Nacklace 【HDU - 3746】【KMP补周期】

    KMP算法的讲解 自己的领悟可随时提问 题目链接 题意 有一个字符序列 现在问你 序列后面最少补充几个元素使其恰能成为几个重复循环的序列 题目还是很良心的 让我们求字符串后面放几个字符可以使其变成周期字符串 所以还是可以想到用KMP的nex
  • KMP算法详解

    一 什么是KMP算法 KMP主要应用在字符串匹配上 KMP的主要思想是当出现字符串不匹配时 通过已知一部分之前已经匹配的内容 避免从头再去做匹配 所以KMP算法的重点就是如何记录已经匹配的信息 也就是next 数组的实现 二 什么是next
  • 超详细超全超好理解的KMP算法

    定义 KMP算法是一种字符串匹配算法 用于在一个主串中查找一个模式串的出现位置 先看这个视频 再看下边的代码实现 油管阿三哥讲KMP查找算法 中英文字幕 人工翻译 简单易懂 https www bilibili com video BV18
  • 剪花布条 【HDU - 2087】【KMP模板题】

    KMP教学链接 不懂的可以在线问 题意 2个字符串A B 问A中有多少个字符串B Input 输入中含有一些数据 分别是成对出现A B A和B不会超过1000个字符 如果遇见 字符 则表示测试结束 Output 输出B的个数 每个结果之间应
  • 使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发

    使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile KMM 开发 文章中探讨了 Google 提供的应用架构指南在多平台上的实现 通过共享视图模型 View Models 和共享 UI 状态 UI St
  • 数据结构中Java实现KMP与BF算法对比

    public class KMPANDBF public int indexBfCount SeqString s SeqString t int begin int slen tlen i begin j 0 int count 0 sl
  • LeetCode 1967. 作为子字符串出现在单词中的字符串数目(BM、KMP)

    给你一个字符串数组 patterns 和一个字符串 word 统计 patterns 中有多少个字符串是 word 的子字符串 返回字符串数目 子字符串 是字符串中的一个连续字符序列 示例 1 输入 patterns a abc bc d
  • BF,KMP,BM三种字符串匹配算法性能比较

    三种最基本的字符串匹配算法是BF KMP以及BM BF算法是最简单直接的匹配算法 就是逐个比较 一旦匹配不上 就往后移动一位 继续比较 所以比较次数很都 关于KMP和BM的详细介绍可以参考下面的两个link 是讲得比较好的 KMP http
  • 【扩展KMP】POJ_3450| HDU_2328 Corporate Identity

    原题直通车 POJ 3450 Corporate Identity HDU 2328 Corporate Identity 题意概述 找出N个串中最长公共子串 分析 一 可以直接枚举其中一个串的所有字串 跟所有串进行匹配找到结果 二 用其中
  • Count the string【KMP】

    It is well known that AekdyCoin is good at string problems as well as number theory problems When given a string s we ca
  • KMP比较简单的讲法。

    转载链接 http blog csdn net yearn520 article details 6729426 我们在一个母字符串中查找一个子字符串有很多方法 KMP是一种最常见的改进算法 它可以在匹配过程中失配的情况下 有效地多往后面跳

随机推荐

  • Permutation 排列组合,主要是字符串的排列offer上的题目,还有leetcode的组合

    一个简洁版的结果过程说明 xff0c 固定一个位 xff0c 变换其他位 a b c d a b d c a c b d a c d b a d c b a d b c void perm char list int i int n int
  • winpcap编程函数介绍

    1 int pcap findalldevs pcap if t char 说明 xff1a 用来获得网卡的列表 参数 xff1a 指向pcap if t 类型的列表的指针的指针 char型指针 当打开列表错误时返回错误信息 返回值 为in
  • shell脚本实现数据库自动备份

    自动备份参考一 三步骤即可 xff0c 二步骤实现备份成功的同时推送消息到钉钉群 xff08 可省略 xff09 一 shell脚本实现数据库自动备份内容如下 xff08 我将脚本名称命名为back sh xff09 xff08 可复制以下
  • 【Week4 CSP B】咕咕东想吃饭【模拟】

    题意 xff1a 一共有n天 xff0c 每天需要买ai个生煎 共有两种购买方式 xff1a 在某一天一次性买两个 xff0c 或者为今明两天各买一个 每种购买方式都可以使用无数次 请问是否能每天恰好买ai个生煎 xff08 最后一天不能用
  • 【Week4 CSP C】可怕的宇宙射线【dfs剪枝】

    题意 xff1a 宇宙射线会在无限的二维平面上传播 xff08 可以看做一个二维网格图 xff09 xff0c 初始方向默认向上 宇宙射线会在发射出一段距离后分裂 xff0c 向该方向的左右45度方向分裂出两条宇宙射线 xff0c 同时威力
  • 【Week4作业 A】DDL的恐惧【贪心】

    题意 xff1a 有n个作业 1 lt 61 n lt 61 1000 xff0c 每个作业都有自己的DDL与平时分 请安排做作业的顺序 xff0c 拿到最多的平时分 输入 xff1a 共T个测试样例 xff0c 每个测试样例共三行 xff
  • 【Week5作业 C】平衡字符串【尺取法】

    题意 xff1a 一个长度为n xff08 n是4的倍数 xff09 的字符串s xff0c 其中仅包含 Q W E 39 R 四种字符 若四种字符在字符串中出现次数均为n 4 xff0c 则其为一个平衡字符串 现可以将s中连续的一段子串替
  • 【Week8作业 A】区间选点II【差分约束】

    题意 xff1a 给定一个数轴上的n个区间 xff0c 要求在数轴上选取最少的点使得第i个区间 ai bi 里至少有ci个点 1 lt 61 n lt 61 50000 0 lt 61 ai lt 61 bi lt 61 50000 1 l
  • 【Week8作业 B】猫猫向前冲【拓扑排序】

    题意 xff1a 一共n只猫猫 xff0c 编号依次为1至n 有m场猫猫比赛 xff0c p1 p2表示猫猫p1赢了猫猫p2 现求字典序最小的名次序列 思路 xff1a 猫猫之间的胜负关系可以构成一张有向无环图 xff0c p1赢了p2等价
  • 【Week8作业 C】班长竞选【SCC缩点】

    题意 xff1a 大学班级选班长 xff0c n个同学均可以发表意见 若意见为A B xff0c 则表示A认为B合适 意见具有传递性 xff0c 即A认为B合适 xff0c B认为C合适 xff0c 则A也认为C合适 共m条意见 xff0c
  • 【Week9作业 A】咕咕东的目录管理器【模拟】

    题意 xff1a 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响 xff0c 时不时发生故障 xff0c 他受不了了 xff0c 想要写一个高效易用零bug的操作系统 这工程量太大了 xff0c 所以他定了一个小目标 xff0c 从实
  • 【Week12作业 B】必做题-2【模拟】

    题意 xff1a zjm被困在一个三维的空间中 现在要寻找最短路径逃生 xff01 空间由立方体单位构成 zjm每次向上下前后左右移动一个单位需要一分钟 xff0c 且zjm不能对角线移动 空间的四周封闭 zjm的目标是走到空间的出口 是否
  • 【Week12作业 C】必做题-3【动态规划】

    题意 xff1a 东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 每个寝室里面有ai个人 1 lt 61 i lt 61 n 从第i到第j个宿舍一共有sum i j 61 a i 43 43 a j 个人 这让宿管阿
  • selenium重要功能应用

    当使用C 编写爬虫时 xff0c 以下是一些常用的爬虫框架 xff1a AngleSharp xff08 用于HTML解析 xff09 HtmlAgilityPack xff08 用于HTML解析 xff09 ScrapySharp xff
  • 【CSP201809-3】元素选择器【模拟】

    题意 思路 xff1a 用point来存储结构化文档 xff0c 里面string label string id为标签和id xff0c int c为所在层数 xff0c 两个点就为一层 读入结构化文档 xff1a 用getline读入一
  • 【Week14作业 B】Q老师与十字叉【模拟】

    题意 xff1a 思路 xff1a 存储网格图不可能开数组a 50000 50000 xff0c 发现n m lt 61 400000 xff0c 可以用a 400001 来存储 xff0c i j gt a i 1 m 43 j 读入数据
  • 【Week14作业 C】Q老师的考验【矩阵快速幂】

    题意 xff1a Q老师 对数列有一种非同一般的热爱 xff0c 尤其是优美的斐波那契数列 这一天 xff0c Q老师 为了增强大家对于斐波那契数列的理解 xff0c 决定在斐波那契的基础上创建一个新的数列 f x 来考一考大家 数列 f
  • 【Week14作业 D】Q老师染砖【矩阵快速幂优化dp】

    题意 xff1a 衣食无忧的 Q老师 有一天突发奇想 xff0c 想要去感受一下劳动人民的艰苦生活 具体工作是这样的 xff0c 有 N 块砖排成一排染色 xff0c 每一块砖需要涂上红 蓝 绿 黄这 4 种颜色中的其中 1 种 且当这 N
  • 【Week15实验 D】瑞瑞爱上字符串【模拟】

    题意 xff1a 瑞瑞最近迷上了字符串 xff0c 因此决定出一个字符串的题 给定两个正整数 N K xff0c 考虑所有由 N 2 个 a 和 2 个 b 组成的字符串 xff0c 要求输出其中字典序第 K 小的 例如当 N 61 5 时
  • 【Week15作业 C】ZJM与纸条【KMP】

    题意 xff1a ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物 ZJM 想知道自己收到的礼物是不是就是她送的