ZJM与纸条

一、题目
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中出现的次数.

四、样例输入输出
Input

3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN

Output

1
3
0

五、解题思路
  KMP算法,用于解决字符串匹配问题,即字符串P是否为字符串S的子串?
思想是:优化暴力匹配的算法,尽量减少比较的趟数,跳过绝不可能成功的字符串比较。定义next数组,当匹配失败时根据next数组判断移动多少位。即如果在P【r】失配,对于P【0…r-1】这一段,前Next【r-1】个字符一定和后Next【r-1】个字符相等,那长度为Next【r-1】的前缀来替代当前的后缀,让P【Next【r-1】】这个字符对准刚失配的位置。
  记Next【x-1】为now
  情况1:P【x】=P【now】,Next[x]=now+1
  情况2:P【x】≠P【now】,尝试缩短now,并且保证对P[0…x-1]而言,它的now-真前缀等于now-真后缀。

六、样例代码

#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;char p[10010];
char s[1000010];
int ans = 0;int Next[10010];void get_next(const char *p, int len)
{Next[0] = 0;for (int i = 1, j = 0; i < len; ++i){while (j && p[j] != p[i]){j = Next[j - 1];}if (p[j] == p[i]) j++;Next[i] = j;}
}void KMP(const char *p, const char *s)
{int len1 = strlen(s);int len2 = strlen(p);int j = 0;get_next(p, len2);for (int i = 0; i < len1; ++i){while (j && p[j] != s[i]){j = Next[j - 1];}if (p[j] == s[i]) j++;if (j == len2){ans++;j = Next[j - 1];}}
}void solve()
{ans = 0;scanf("%s", p);scanf("%s", s);KMP(p, s);cout << ans << endl;
}int main()
{int t; scanf("%d", &t);for (int i = 0; i < t; i++){solve();}return 0;
}

第十五周作业——ZJM与纸条相关推荐

  1. 第十五周作业——ZJM与生日礼物

    ZJM与生日礼物 一.题目 ZJM 收到了 Q老师 送来的生日礼物,但是被 Q老师 加密了.只有 ZJM 能够回答对 Q老师 的问题,Q老师 才会把密码告诉 ZJM. Q老师 给了 ZJM 一些仅有 ...

  2. g第十四周,十五周作业

    1.数组中偶数的和 #include <stdio.h> int main(){int i,s=0;int a[10];for(i=0;i<=9;i++){scanf("% ...

  3. linux内核实验教程答案,20199310《Linux内核原理与分析》第十五周作业 Linux安全实验...

    1 补充知识 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭, ...

  4. 信息安全系统设计基础第十五周总结

    信息安全系统设计基础第十五周总结 [内容:链接汇总] 一.每周读书笔记链接汇总 [第一周读书笔记] http://www.cnblogs.com/shadow135211/p/4824555.html ...

  5. 20189200余超 2018-2019-2 移动平台应用开发实践第十二周作业

    20189200余超 2018-2019-2 移动平台应用开发实践第十二周作业 服务 Service的声明 Service是Android中的四大组件,使用它一定要在AndroidManifest.x ...

  6. Python第五周作业

    Python第五周作业 1. 一元二次方程求根 2. 百钱买百鸡 3. 鸡兔同笼 4. 最大公约数和最小公倍数 5. 判断三角形并计算面积 6. 判断IP地址合法性 7. 回文素数 8. 反素数 9. ...

  7. 2017面向对象程序设计(Java)第十五周学习总结

    上周,老师要求同学们自学应用程序部署,并布置了相关的实验任务.此次实验的目的是掌握Java应用程序的打包操作:了解应用程序存储配置信息的两种方法: 了解Applet小应用程序的开发及应用方法:掌握基于 ...

  8. 第十五周助教工作总结

    第十五周助教工作总结--李克龙 助教博客链接:https://www.cnblogs.com/lkl7117/ 本次作业的要求:https://www.cnblogs.com/nwnu-daizh/p ...

  9. 2021年春季学期-信号与系统-第十五次作业参考答案-第十一小题参考答案

    本文是 2021年春季学期-信号与系统-第十五次作业参考答案 中各小题的参考答案. §11 第十一小题 11.使用级联结构实现以下传递函数: ▓ 求解 (1)第一小题 X(z)=1−14z−1(1+1 ...

最新文章

  1. ffmpeg-20160526-git-bin
  2. 计算机中什么是适配器及作用,适配器是什么?适配器的作用主要有哪些
  3. PostCss 从0开始
  4. 一致性算法- Paxos
  5. java 32 questions
  6. C#综合揭秘——细说多线程(上)
  7. C++ decltype类型说明符(尾置返回类型使用)
  8. 浅释一下,为什么要使用接口?
  9. 利用UIScrollView和UIPageControl实现图片切换
  10. Eclipse中快速使代码对齐?1张图搞定!
  11. 配置ouster雷达过程
  12. ubuntu codename
  13. ShareX:一款你值得拥有的截图识别工具ShareX
  14. 摆脱客户端?网页发起直播势在必行!
  15. 光滑曲线_高等数学八:(3)曲线积分与路径无关的条件
  16. 三叶草新冠候选疫苗在全球2/3期临床试验结果显示对德尔塔变异株的保护效力为79%...
  17. 关于前端video标签视频无法拖动进度条快进问题(Django)
  18. C++ 数据结构学习 ---- 栈及其应用
  19. 如何提高google pr值
  20. Android基础:Android概念

热门文章

  1. Node.js的线程和进程*2014年4月的文章
  2. WordPress初学者入门教程-“经典”所见即所得编辑器
  3. 智能门锁是智能家居入口
  4. 耐威迪综合布线可视化管理软件与Visio在数据中心应用中的区别
  5. GPU运算能力对比(详细)
  6. opencv +python采集识别填涂卡(答题卡)数据
  7. 银行间市场的USDCNY即期一天交易量到底有多少?
  8. 2022危化品企业双重预防机制数字化建设成为迫切任务
  9. 页面验证是否是真实有效的身份证号码
  10. 三菱fx1n40mr001接线图_三菱FX1N-40MR-001使用说明书 - 广州凌控