题目描述

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中出现的次数.

样例输入

3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

样例输出

1
3
0

思路

KMP算法

作用

判断字符串P是否为字符串S的子串即字符串匹配问题

暴力解法

记n=len(S),m=len§,枚举i=0,1,…,n-m,将S[i,i+m]与P比较,复杂度为O(nm)

KMP优化

上述暴力算法中每次比较失败,后移一位继续比较,KMP跳过那些绝不可能成功的字符串比较,尽量减少比较的趟数。
核心:next数组
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]]这个字符对准刚刚匹配失败的地方进行下一次匹配。

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
char ptr[10005];
char str[1000005];
int Next[10005];
void getnext(char*pstr,int len)
{Next[0]=0;for(int i=1,j=0;i<len;i++){while(j&&pstr[i]!=pstr[j])j=Next[j-1];if(pstr[i]==pstr[j])j++;Next[i]=j;}
}
int KMP(char*str,char*ptr)
{int len1=strlen(str);int len2=strlen(ptr);int cnt=0;getnext(ptr,len2);for(int i=0,j=0;i<len1;i++){while(j&&str[i]!=ptr[j]) j=Next[j-1];if(str[i]==ptr[j])j++;if(j==len2){cnt++;j=Next[j-1];}}return cnt;
}
int main(int argc, char** argv) {int T;scanf("%d",&T);while(T--){scanf("%s",ptr);scanf("%s",str);int ans=KMP(str,ptr);printf("%d\n",ans);}return 0;
}

【Week 15 作业C】ZJM与纸条相关推荐

  1. 第十五周作业——ZJM与纸条

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

  2. 网络安全2020.6.15作业

    网路安全2020.6.15作业 Windows的发展路程: Windows1.0是微软1983年发布的,只能用dos来操作 Windows2.0是1987年上市的,增强了键盘和鼠标,加入功能表和对话框 ...

  3. WEEK 15 C ZJM 与纸条

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

  4. 【Week 15 作业A】ZJM 与霍格沃兹

    题目描述 ZJM 为了准备霍格沃兹的期末考试,决心背魔咒词典,一举拿下咒语翻译题 题库格式:[魔咒] 对应功能 背完题库后,ZJM 开始刷题,现共有 N 道题,每道题给出一个字符串,可能是 [魔咒], ...

  5. ZJM 与纸条(KMP算法)

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

  6. [week15] C - ZJM与纸条(选做)—— KMP算法

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

  7. 【渝粤教育】电大中专电商运营实操 (15)作业 题库

    1.目前菜鸟网络依赖大数据和云计算已实现了哪些功能( ) A.智能分单 B.自动化仓库 C.以上都正确 D.智能发货 E.物流云加速 错误 正确答案:左边查询 学生答案:E 2.目前( )的电子商务呈 ...

  8. week15作业A ZJM 与霍格沃兹

    ZJM 为了准备霍格沃兹的期末考试,决心背魔咒词典,一举拿下咒语翻译题 题库格式:[魔咒] 对应功能 背完题库后,ZJM 开始刷题,现共有 N 道题,每道题给出一个字符串,可能是 [魔咒],也可能是对 ...

  9. 程序设计思维与实践 Week15 作业A - ZJM 与霍格沃兹

    题意: ZJM 为了准备霍格沃兹的期末考试,决心背魔咒词典,一举拿下咒语翻译题 题库格式:[魔咒] 对应功能 背完题库后,ZJM 开始刷题,现共有 N 道题,每道题给出一个字符串,可能是 [魔咒],也 ...

最新文章

  1. 大脚本运行常见问题总结
  2. java方法里执行两条sql_Java如何在数据库上执行多个SQL命令?
  3. centos创建禁止登录用户
  4. EF 5.0 帮助类 增删改查
  5. 有趣设计工作室创始人段先洲:UI设计师的名利场
  6. k8s控制器:DaemonSet
  7. 基于mykernel完成多进程的简单内核
  8. three20 TTTableViewController + TTActionSheetController
  9. mysql 小写null 大写null_mysql中的null字段值的处理及大小写问题
  10. Oracle查询重复数据
  11. 计算机网络协议各协议的作用,计算机网络通信协议有哪些?作用是什么?
  12. Java基础——常用对象API(4):集合框架5:Map集合
  13. 爽!Android模拟器可以运行ARM应用了
  14. 10秒钟搞定圆柱齿轮设计所有课题
  15. 为什么安卓手机没有苹果手机流畅?
  16. 驾驶证学法减分助手小程序源码(带搭建视频教程)
  17. 音频标准AES的一点理解
  18. JS监听手机物理返回键(及IOS微信端的bug)
  19. Python控制Excel表格的操作以及问题处理
  20. 门窗软件测试自学,AutoCAD 2014室内装潢设计完全自学手册[9787111482352]

热门文章

  1. python进行微积分运算——sympy库简介
  2. WINS服务器的作用
  3. java 已死_Java已死?九百万程序员说不
  4. echart x轴标签偏移_echarts x 轴最后一个刻度右对齐
  5. Python3 实现两个列表的值相减
  6. 华为机试_HJ34 图片整理【简单】【半收藏】
  7. 神经元的集体行为:大尺度脑活动的动力学模型
  8. WiFi市场之我见(4)
  9. NSArray截取元素
  10. Ubuntu18.04设置开机自启动自己的程序、脚本