集训总结DAY.1(18.5.22)——KMP
DAY 1——5.22
in the morning 依稀记得我们有一场contest。
at night
chf大佬讲KMP,先膜一波~
luoguP3375KMP模板题
KMP算法,又称模式匹配算法,能在线性时间内判定字符串S1[1~N]是否为字符串S2[1~M]的子串。
一、朴素的做法 O(M*N)
尝试枚举字符串S2中的每个位置i,把字符串S1与字符串S2的后缀S2[i~M]对齐,向后扫描逐一比较S1[1]与S2[i],S1[2]与S2[i+1]......是否相等。
string s1,s2;
//s1(n)>=s2(m)
for(int i=;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
//字符串下标从0开始
if(s1[i]==s2[j]) ...
}
}
二、Hash!
在O(N)的时间内预处理一个字符串的所有前缀Hash值,并在O(1)的时间内查询该字符串任意子串的Hash值。枚举S1中的每个位置i(M<=i<=N),检查字符串S2中的Hash值与字符串A中的子串S1[i-M+1~i]的Hash值是否相同。
那么,什么是KMP?
1.对字符串S1进行自我匹配,求出一个数组next,其中next[i]表示“S1中以S1结尾的非前缀子串(有i-1个)”与“S1的前缀”能够匹配的最长长度。
如S1[2~i]与S1[1~i-1],S1[3~i]与S2[1~i-2]......
由此依次匹配对比,若得出的最大匹配值为k(即为参与比较的字串长度,若匹配,则其长度为匹配值),next[i]=k;
next[i]=max{j},其中j<i并且S1[i-j+1~i]=S1[1~j]
求next数组
(1)初始化next[1]=j=0,假使next[1~i-1]已求出,求解next[i]。
(2)不断尝试扩展匹配长度j,如果扩展失败(下一个字符不相等),令j变为next[j],直至j变为0(应该重新从头开始匹配)。
(3)如果能匹配成功,匹配长度j就增加1.next[i]的值就是j。
对于next数组,老师在讲课时又提出了几个问题,能加深理解:
想清楚再看答案哦
question:next[i]是否能大于next[i-1]+1? why?
answer: of course not.因为i表示从1~i的前缀能匹配的最长字符个数。
next[]=;
for(int i=,j=;i<=n;i++)
{
while(j>&&a[i]!=a[j+]) j=next[j];
if(a[i]==a[j+]) j++;
next[i]=j;
}
2.对字符串S1与S2进行匹配,求出一个数组f,其中f[i]表示“S2中以i结尾的子串”与“S1的前缀”能够匹配的最长长度。
f[i]=max{j},其中j<=i并且S2[i-j+1~i]=S1[1~j]
(其实求解f和next是很像的,自己写看看)
完整code不再给了,上面的链接点开会有很多很优秀的正解~~
集训总结DAY.1(18.5.22)——KMP的更多相关文章
- lazarus 2016 2月18 4:22:35 支持android开发了, 既ios,linux,macosx,window,web 后 囊括一切啦。 哈哈
Android Development Lazarus for Linux Lazarus for Mac OS X Lazarus for iOS Lazarus for Windows Lazar ...
- 2019/4/22 kmp模板
题目连接:传送门!!! 这里是从头到尾彻底理解KMP的一篇博客,写的非常好 :https://blog.csdn.net/v_JULY_v/article/details/7041827 题意:输入多 ...
- [JZOJ 5437] [NOIP2017提高A组集训10.31] Sequence 解题报告 (KMP)
题目链接: http://172.16.0.132/senior/#main/show/5437 题目: 题解: 发现满足上述性质并且仅当A序列的子序列的差分序列与B序列的差分序列相同 于是我们把A变 ...
- Java——多线程---18.11.22
多线程代码:Runnable方法 package com.hebust.java.third; import java.util.Random; public class SaleTicket imp ...
- [18/11/22] 将点分十进制的IP地址化成二进制输出
#include <stdio.h> void binary(int d){ ,j,n,b[]={}; ){ n=d%; d=d/; b[i++]=n; //不停的除2,余数保存在b[8] ...
- 牛客网NOIP赛前集训营-提高组18/9/9 A-中位数
链接:https://www.nowcoder.com/acm/contest/172/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 18.9.22 noip模拟赛
此题为找规律.期望100 实际100 #include<cstdio> #include<cstring> #include<iostream> #include& ...
- 18.09.22模拟赛T2 历史
网上基本上找不到这道题,何况LJJ还稍微改了一下...... 原题:传送门 题目描述 ljj 被S 国数不清的漂亮小姐姐所吸引,为了搞清楚为什么S 国有如此多的漂亮小姐姐,他决定研究S 国的历史. 根 ...
- 北京Uber优步司机奖励政策(11月16日~11月22日)
用户组:人民优步“关羽组”(适用于11月16日-11月22日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/ ...
随机推荐
- aop编程之后置通知,环绕通知和异常通知
---恢复内容开始--- 此将实例将在上一讲前置通知的基础上进行配置,前置配置内容:http://www.cnblogs.com/lihuibin/p/7955947.html 具体流程如下: 1. ...
- Python记录1:基础知识常识
今日内容: 一,Python的数据类型 Python一共有以下几种常见的数据类型:int(整形) float(浮点型) str(字符串) list(列表) tuple元组 dict(字典) ...
- 依赖反转Ioc和unity,autofac,castle框架教程及比较
1.依赖倒置的相关概念 http://www.cnblogs.com/fuchongjundream/p/3873073.html IoC模式(依赖.依赖倒置.依赖注入.控制反转) 2.依赖倒置的方式 ...
- C++中overload(重载),override(覆盖),overwrite(重写/覆写)的区别
#include <cstdio> #include <cstdlib> class Base { public: #pragma region MyRegion1 //函数重 ...
- 深度解读 AlphaGo 算法原理
http://blog.csdn.net/songrotek/article/details/51065143 http://blog.csdn.net/dinosoft/article/detail ...
- Codeforces Round #324 (Div. 2) E
这题贪心,考虑先放第一个,然后从第一个数在p中的位置, 不断的往前走,和在他后面的那些数组进行交换,因为这样交换可以提高最大的效率,就是说你花费了1但是使得两个点都朝他的木匾节点减少了1 #inclu ...
- 【转】LoadRunner压力测试:测试报告结果分析
见:https://blog.csdn.net/haoui123/article/details/62036723
- 动态创建 Plist 文件
简介 Property List,属性列表文件,它是一种用来存储串行化后的对象的文件.属性列表文件的扩展名为.plist ,因此通常被称为 plist文件,文件是xml格式的. 写入plist文件 在 ...
- 转:[你必须知道的异步编程]——异步编程模型(APM)
本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些 ...
- SpringBoot整合redis哨兵主从服务
前提环境: 主从配置 http://www.cnblogs.com/zwcry/p/9046207.html 哨兵配置 https://www.cnblogs.com/zwcry/p/9134721. ...