集训总结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司机(全国版最新最详细注册流程)/ ...
随机推荐
- Minecraft 1.8.9 FML Mod 开发教程
Mod开发教程 https://fmltutor.ustc-zzzz.net/
- not value specified for parameter问题解决方案
前段时间遇到这个问题找了半天没有找到,今天又调试了突然发现出现这个问题的根本原因是sql语句中的参数没有赋值或者参数类型与数据库字段类型不匹配所导致的. 例如: String sql = " ...
- c# Tuple新特性
class Operation { internal Tuple<int, int> FindMinMax(List<int> list) ...
- linux设置时间显示格式和系统版本
[修改显示日期格式] vim /etc/bashrc alias ll='ls -l --time-style="+%Y-%m-%d %H:%M:%S"' alias date=' ...
- php aes128加密
//[加密数据]AES 128 ECB模式 public function aesEncrypt($str){ $screct_key = Yii::$app->params['encryptK ...
- LoadRunner录制登录机票网址,并回放,加断言
回放录制登录过程脚本,加断言 在页面登录的过程如下: 1先进入http://127.0.0.1:1080/WebTours/index.htm 2之后获取userSession信息 3在输入信息后点击 ...
- CSS, JavaScript 压缩, 美化, 加密, 解密
CSS, JavaScript 压缩, 美化, 加密, 解密 JS压缩, CSS压缩, javascript compress, js在线压缩,javascript在线压缩,css在线压缩,YUI C ...
- Step6:SQL Server 数据变更时间戳(timestamp)在复制中的运用
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 方案(Solution) 方案一(Solution One) 方案二(Solution Two ...
- The Little Prince-11/29
The Little Prince-11/29 The wheat fields have nothing to say to me. And that is sad. But you have ha ...
- javaweb笔记09—(session会话及验证码问题)
第一部分+++++++++++1.session会话 定义:session会话——对某个web应用程序的一次整体访问的过程. 由来:无连接的http协议是无状态的,不能保存每个客户端私有信息 a用户和 ...