ZJM 与纸条(KMP算法)

2023-05-16

问题描述

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

Input

第一行输入一个整数代表数据的组数

每组数据第一行一个字符串 P 代表 ZJM 想要的礼物, 包含英语字符 {‘A’, ‘B’, ‘C’, …, ‘Z’}, 并且字符串长度满足 1 ≤ |P| ≤ 10,000 (|P| 代表字符串 P 的长度).

接下来一行一个字符串 S 代表 ZJM 女朋友的纸条, 也包含英语字符 {‘A’, ‘B’, ‘C’, …, ‘Z’}, 满足 |P| ≤ |S| ≤ 1,000,000.

Output

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

Sample input

3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

Sample output

1
3
0

解题思路

这个题是一道字符串匹配问题,因此我们可以用到KMP算法,这是一道经典的字符串匹配算法,其中next数组的思想十分重要(AC自动机中也用到了这个数组)。KMP讲解可以看一下这个链接。

KMP的时间复杂度可以达到 O ( m + n ) O(m+n) O(m+n)。我用Sunday算法尝试了一下这个题,结果TLE了,不知道是数据卡Sunday还是我自己改Sunday改错了。Sunday有点不稳定,平均复杂度 O ( n ) O(n) O(n),最坏 O ( n ∗ m ) O(n*m) O(nm)。有兴趣的可以看一下这个博客。

完整代码

//#pragma GCC optimize(2)
//#pragma G++ optimize(2)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;

const int maxn=10000+10;
const int maxm=1000000+10;
int nxt[maxn],ans,n;
char ptr[maxn],str[maxm];
void get_next(const char ptr[],int len){
    nxt[0]=0;
    for (int i=1,j=0; i<len; i++){
        while(j && ptr[j]!=ptr[i]) j=nxt[j-1];
        if(ptr[j]==ptr[i]) j++;
        nxt[i]=j;
    }
}
int kmp(const char str[],const char ptr[]){
    int len1=strlen(str);
    int len2=strlen(ptr);
    int j=0;
    get_next(ptr,len2);
    for (int i=0; i<len1; i++){
        while(j && ptr[j]!=str[i]) j=nxt[j-1];
        if(ptr[j]==str[i]) j++;
        if(j==len2){
            ans++;
            j=nxt[j-1];
        }
    }
    return ans;
}
int getint(){
    int x=0,s=1; char ch=' ';
    while(ch<'0' || ch>'9'){ ch=getchar(); if(ch=='-') s=-1;}
    while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();}
    return x*s;
}
int main(){
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    scanf("%d",&n);
    while(n--){
        memset(ptr,0,sizeof(ptr));
        memset(str,0,sizeof(str));
        memset(nxt,0,sizeof(nxt));
        ans=0;
        scanf("%s",ptr);
        scanf("%s",str);
        printf("%d\n",kmp(str,ptr));
    }
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZJM 与纸条(KMP算法) 的相关文章

  • 串的模式识别和kmp算法

    串的简单模式匹配 与 KMP 获取next数组 参考书籍 王道 数据结构 代码验证软件 xff1a vs2019 include lt iostream gt typedef char SString 暴力比对 S abcabaaabaab
  • w15作业--ZJM 与霍格沃兹(必做)

    题意 xff1a ZJM 为了准备霍格沃兹的期末考试 xff0c 决心背魔咒词典 xff0c 一举拿下咒语翻译题 题库格式 xff1a 魔咒 对应功能 背完题库后 xff0c ZJM 开始刷题 xff0c 现共有 N 道题 xff0c 每道
  • A - ZJM 与霍格沃兹 (Week15 作业)

    A ZJM 与霍格沃兹 Sample Input expelliarmus the disarming charm rictusempra send a jet of silver light to hit the enemy tarant
  • JAVA代码实现字符串匹配(一)——BF、KMP

    话不多说 xff0c 直接进入主题 xff1a 题目描述 xff1a 给定两个字符串text和pattern xff0c 请你在text字符串中找出pattern字符串出现的第一个位置 xff08 下标从0开始 xff09 xff0c 如果
  • week15作业A ZJM 与霍格沃兹

    ZJM 为了准备霍格沃兹的期末考试 xff0c 决心背魔咒词典 xff0c 一举拿下咒语翻译题 题库格式 xff1a 魔咒 对应功能 背完题库后 xff0c ZJM 开始刷题 xff0c 现共有 N 道题 xff0c 每道题给出一个字符串
  • 【Week 15 作业C】ZJM与纸条

    题目描述 ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM 送生日礼物 ZJM 想知道自己收到的礼物是不是就是她送的 xff0
  • [week15] C - ZJM与纸条(选做)—— KMP算法

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM
  • ZJM 与纸条

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

    题目大意 xff1a 对于一个字符串 xff0c 找由循环字符串组成的位置 xff0c 并输出最多循环了几次 xff0c 比如两个样例 xff0c 第一个是 aaa xff0c 所以在第二个位置由子串a循环两次得到 xff0c 第三个位置由
  • 9.KMP算法

    KMP算法 1 KMP算法解决的问题 字符串str1和str2 xff0c str1是否包含str2 xff0c 如果包含返回str2在str1中开始的位置 xff0c 如果不包含返回 1 如果做到时间复杂度O N 完成 xff1f 测试用
  • Cyclic Nacklace 【HDU - 3746】【KMP补周期】

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

    1 KMP算法 KMP算法是一种保证线性时间的字符串查找算法 由Knuth Morris和Pratt三位大神发明 而算法取自这三人名字的首字母 因而得名KMP算法 那发明这样的字符串查找算法又有什么用 在当时计算机本身非常昂贵 计算资源更是
  • Simpsons’ Hidden Talents【KMP模板题】

    Homer Marge I just figured out a way to discover some of the talents we weren t aware we had Marge Yeah what is it Homer
  • 剪花布条 【HDU - 2087】【KMP模板题】

    KMP教学链接 不懂的可以在线问 题意 2个字符串A B 问A中有多少个字符串B Input 输入中含有一些数据 分别是成对出现A B A和B不会超过1000个字符 如果遇见 字符 则表示测试结束 Output 输出B的个数 每个结果之间应
  • kmp算法(最简单最直观的理解,看完包会)

    本文将以特殊的方式来让人们更好地理解kmp算法 不包括kmp算法的推导 接下来 我们将从朴素算法出发 在这之前 我们先设主串为S 模式串为T 我们要解决的询问是主串中是否包含模式串 即T是否为S的子串 版权声明 本文为原创文章 转载请标明出
  • LeetCode 1967. 作为子字符串出现在单词中的字符串数目(BM、KMP)

    给你一个字符串数组 patterns 和一个字符串 word 统计 patterns 中有多少个字符串是 word 的子字符串 返回字符串数目 子字符串 是字符串中的一个连续字符序列 示例 1 输入 patterns a abc bc d
  • Oulipo

    点击打开链接 Problem Description The French author Georges Perec 1936 1982 once wrote a book La disparition without the letter
  • Period 【HDU - 1358】【KMP求周期】

    学习KMP算法可以参阅这篇文章 不懂的可以在线回答 题目链接 题意 我们想知道一串字符中的前缀中有多少最大周期数 例如 aaa 中 前两个 aa 最小周期长度为 a 所以周期长度为2 前三个 aaa 的最小周期也是 a 所以周期长度为3 再
  • 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是一种最常见的改进算法 它可以在匹配过程中失配的情况下 有效地多往后面跳

随机推荐

  • 阿里云Ubuntu+apache2配置https

    前提 去阿里云申请一个SSL证书等待系统签发好 签发好之后下载apache类型的证书 我购买的CA证书下载之后解压得到了三个文件 把这三个文件上传到服务器的 etc apache2 ssl文件夹内 文件格式如下 xff1a xxxxxxxx
  • 通过组策略编辑器关闭Windows自动更新

    本地组策略编辑器是Windows上的一个实用工具 xff0c 允许您配置本地组策略设置 您可以通过本地组策略编辑器彻底关闭Windows更新 xff0c 也可以将Windows更新调整为手动安装 xff0c 一切都可以根据实际情况进行设置
  • 腾讯云服务器Ubuntu-使用nginx发布网页项目

    最近笔者学习了node js和vue js xff0c 目前还处于基础的水平 xff0c 但已经可以写项目了 正好写了一个vue js的项目 xff0c 使用element ui xff0c 实现了登陆和增删改查的功能 xff0c 所以 x
  • DVWA靶场环境搭建

    文章目录 一 环境二 搭建过程2 1 windows信息2 2 PHPStudy搭建2 3 Mysql环境变量配置2 4 DVWA靶机配置 一 环境 Windows10PHPStudyDVWA 二 搭建过程 2 1 windows信息 查看
  • 1.PostgreSQL日常运维管理

    1 版本查看 postgres 61 select version version PostgreSQL 12 2 on x86 64 pc linux gnu compiled by gcc GCC 4 8 5 20150623 Red
  • TT's Magic Cat(差分模版题)

    问题描述 给定数组a xff0c 给定操作q个操作 xff1a l r c l r c l r c xff0c 代表将a数组从
  • 氪金带东(树的直径)

    问题描述 实验室里原先有一台电脑 编号为1 xff0c 最近氪金带师咕咕东又为实验室购置了N 1台电脑 xff0c 编号为2到N 每台电脑都用网线连接到一台先前安装的电脑上 但是咕咕东担心网速太慢 xff0c 他希望知道第i台电脑到其他电脑
  • 掌握魔法の东东 II(模拟)

    问题描述 hspace 17pt 从瑞神家打牌回来后 xff0c 东东痛定思痛 xff0c 决定苦练牌技 xff0c 终成赌神 xff01 hspace 17pt 东东有 A B 张扑克牌 每张扑克牌有一个大小 整数 xff0c
  • 外排序(最小输者树实现)

    问题描述 应用竞赛树结构模拟实现外排序 基本要求 xff08 1 xff09 设计实现最小输者树结构ADT xff0c ADT中应包括初始化 返回赢者 xff0c 重构等基本操作 xff08 2 xff09 设计实现外排序 xff0c 外部
  • HRZ学英语(类似尺取)

    时间限制1s xff0c 空间限制64MB 题目描述 瑞神今年大三了 xff0c 他在寒假学会了英文的26个字母 xff0c 所以他很兴奋 xff01 于是他让他的朋友TT考考他 xff0c TT想到了一个考瑞神的好问题 xff1a 给定一
  • CLion找不到头文件解决方案

    这两天我的air换了硬盘 xff0c 使用时间机器恢复 xff0c 出现五国问题 xff0c 被迫重装系统 xff0c 结果发现CLion找不到头文件了 xff0c 所有的头文件下面都有红色波浪形标错 xff0c 找了两种方法 xff0c
  • 东东与 ATM(多重背包)

    问题描述 一家银行计划安装一台用于提取现金的机器 机器能够按要求的现金量发送适当的账单 机器使用正好N种不同的面额钞票 xff0c 例如 D k xff0c k 61
  • 网络Socket编程指南

    文章目录 前言1 xff09 说明2 xff09 介绍3 xff09 读者对象4 xff09 平台和编译器5 xff09 Windows程序员要注意的事情 正文一 何为Socket 1 xff09 什么是 socket 2 xff09 In
  • N-ary Trie的实现与分析(字典树)

    实现功能 初始化文档 xff08 默认文档中全是小写字母 xff0c 并且无重复单词 xff09 xff0c 将内部单词存入字典树 xff08 每行一个单词 xff09 xff0c 实现以下功能 xff1a 查找单词 xff08 输出单词行
  • linux c++select多人聊天程序

    比较简单的多人聊天程序 xff0c 可直接运行 主要是实现功能 没有界面也没有多余功能 xff0c 只是实现群聊天的功能 c s模式 server端用select多路复用来做 xff0c 可以接受多个客户端连接 client端启动2个线程控
  • Week12-必做题2(BFS搜索三维迷宫)

    问题描述 zjm被困在一个三维的空间中 现在要寻找最短路径逃生 xff01 空间由立方体单位构成 zjm每次向上下前后左右移动一个单位需要一分钟 xff0c 且zjm不能对角线移动 空间的四周封闭 zjm的目标是走到空间的出口 是否存在逃出
  • TT的奖励(动态规划)

    问题描述 在大家不辞辛劳的帮助下 xff0c TT 顺利地完成了所有的神秘任务 神秘人很高兴 xff0c 决定给 TT 一个奖励 xff0c 即白日做梦之捡猫咪游戏 捡猫咪游戏是这样的 xff0c 猫咪从天上往下掉 xff0c 且只会掉在
  • Q老师与十字叉

    问题描述 Q老师 得到一张 n 行 m 列的网格图 xff0c 上面每一个格子要么是白色的要么是黑色的 Q老师认为失去了 十字叉 的网格图莫得灵魂 一个十字叉可以用一个数对 x 和 y 来表示 其中 1 x n 并且 1 y m 满足在第
  • Q老师的考验(矩阵快速幂)

    问题描述 Q老师 对数列有一种非同一般的热爱 xff0c 尤其是优美的斐波那契数列 这一天 xff0c Q老师 为了增强大家对于斐波那契数列的理解 xff0c 决定在斐波那契的基础上创建一个新的数列 f x 来考一考大家 数列 f x 定义
  • ZJM 与纸条(KMP算法)

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