[KMP]【学习笔记】
KMP裸题 出现几次
//
// main.cpp
// poj3461
//
// Created by Candy on 10/19/16.
// Copyright © 2016 Candy. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e6+,M=1e4+;
int T,f[M];// already i(0...i-1),now pos i
char s[N],p[M];
void getFail(){
size_t m=strlen(p);
f[]=f[]=;
for(int i=;i<m;i++){
int j=f[i];
while(j&&p[i]!=p[j]) j=f[j];
f[i+]=p[i]==p[j]?j+:;
}
}
int kmp(){
getFail();
int cnt=;
size_t n=strlen(s),m=strlen(p);
int j=;
for(int i=;i<n;i++){
while(j&&s[i]!=p[j]) j=f[j];
if(s[i]==p[j]) j++;
if(j==m) cnt++;
}
return cnt;
}
int main(int argc, const char * argv[]) {
scanf("%d",&T);
while(T--){
scanf("%s%s",p,s);
printf("%d\n",kmp());
} return ;
}
以前愚蠢的从0开始
从0开始太愚蠢了,于是我从1开始重学重写了一遍
1.算法理解(orz 阮一峰):http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
2.摘抄(修改)课件:
- 定义f[i]表示A[1,i]的长度为f[i]的后缀等于A[1,f[i]]
- 【也就是说对于这个子串来说f[i]长度的前缀和后缀相等(注意顺序都是从左到右相等),那么j+1位置匹配失败就可以转移到f[j]位置(因为1..f[j]和刚刚成功的后缀是一样的)继续匹配f[j]+1】
- 多个f[i]符合条件时,取最大的。当然,f[i]是要小于i的(因为前后缀的定义不包括自己),否则就没有意义了。
将i从2到n枚举(f[1]=0是不必计算的),依次计算f[i]。
计算f[i]时,先令now=f[i-1],f[i]最大只会是now+1。只需判断A[i]与A[now+1]是否相等就能判断f[i]是不是now+1。若相等,f[i]=now+1;否则令now=f[now](沿失配边走),继续这个过程。
如果now=0后仍然和now+1不相等,就使f[i]=0- 时间复杂度O(n),因为now最多增加减少n次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e6+,M=1e4+;
int T,fail[M],n,m;
char t[N],p[M];
void getFail(char s[],int n){
fail[]=;
for(int i=;i<=n;i++){
int j=fail[i-];
while(j&&s[j+]!=s[i]) j=fail[j];
fail[i]=s[j+]==s[i]?j+:;
}
}
int kmp(){
int ans=;
getFail(p,m);
int j=;
for(int i=;i<=n;i++){
while(j&&p[j+]!=t[i]) j=fail[j];
j+=p[j+]==t[i];
if(j==m) ans++;
}
return ans;
}
int main(){
freopen("in","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%s%s",p+,t+);
n=strlen(t+),m=strlen(p+);
printf("%d\n",kmp());
} return ;
}
KMP模板
[2017-02-04]KMP的一点性质:
循环节!!!
对于A[1..i],A[1,i-fail[i]]是他的最短循环节,A[1,i-fail[fail[...fail[i]]] ]都是他的循环节 mn[i]表示i最远跳到哪,可以O(n)求每个前缀的最长循环节
循环节移位之后还是循环节
[KMP]【学习笔记】的更多相关文章
- KMP学习笔记
功能 字符串T,长度为n. 模板串P,长度为m.在字符串T中找到匹配点i,使得从i开始T[i]=P[0], T[i+1]=P[1], . . . , T[i+m-1]=P[m-1] KMP算法先用O( ...
- 扩展kmp学习笔记
kmp没写过,扩展kmp没学过可还行. 两个愿望,一次满足 (该博客仅用于防止自己忘记,不保证初学者能看懂我在瞎bb什么qwq) 用途 对于串\(s1,s2\),可以求出\(s2\)与\(s1\)的每 ...
- 扩展kmp 学习笔记
学习了一下这个较为冷门的知识,由于从日报开始看起,还是比较绕的-- 首先定义 \(Z\) 函数表示后缀 \(i\) 与整个串的 \(lcp\) 长度 一个比较好的理解于实现方式是类似于 \(manac ...
- 串的应用与kmp算法讲解--学习笔记
串的应用与kmp算法讲解 1. 写作目的 平时学习总结的学习笔记,方便自己理解加深印象.同时希望可以帮到正在学习这方面知识的同学,可以相互学习.新手上路请多关照,如果问题还请不吝赐教. 2. 串的逻辑 ...
- 「学习笔记」字符串基础:Hash,KMP与Trie
「学习笔记」字符串基础:Hash,KMP与Trie 点击查看目录 目录 「学习笔记」字符串基础:Hash,KMP与Trie Hash 算法 代码 KMP 算法 前置知识:\(\text{Border} ...
- 牛客网《BAT面试算法精品课》学习笔记
目录 牛客网<BAT面试算法精品课>学习笔记 牛客网<BAT面试算法精品课>笔记一:排序 牛客网<BAT面试算法精品课>笔记二:字符串 牛客网<BAT面试算法 ...
- AC自动机板子题/AC自动机学习笔记!
想知道484每个萌新oier在最初知道AC自动机的时候都会理解为自动AC稽什么的,,,反正我记得我当初刚知道这个东西的时候,我以为是什么神仙东西,,,(好趴虽然确实是个对菜菜灵巧比较难理解的神仙知识点 ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- Hash学习笔记
啊啊啊啊,这篇博客估计是我最早的边写边学的博客了,先忌一忌. 本文章借鉴与一本通提高篇,但因为是个人的学习笔记,因此写上原创. 目录 谁TM边写边学还写这玩意? 后面又加了 Hash Hash表 更多 ...
- 【学习笔记】字符串—马拉车(Manacher)
[学习笔记]字符串-马拉车(Manacher) 一:[前言] 马拉车用于求解连续回文子串问题,效率极高. 其核心思想与 \(kmp\) 类似:继承. --引自 \(yyx\) 学姐 二:[算法原理] ...
随机推荐
- 锋利的jQuery--表单等(读书笔记三)
1.input元素中的多选的,单选,不选,涉及属性checked 2.select元素中的选中,涉及selected 3.表单的验证 4.表格隔行变色 $("tr:odd&quo ...
- javascript的垃圾收集机制
× 目录 [1]原理 [2]标记清除 [3]引用计数[4]性能问题[5]内存管理 前面的话 javascript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存.在编写javascri ...
- ASP.NET Core管道深度剖析[共4篇]
之所以称ASP.NET Core是一个Web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET Core应用的很多特性,比 ...
- windows下mysql 主从同步
半路出家到Java,刚开始听说到说程序支持读写分离感觉特别高大上,也一直没接触 偶然的机会接触到了,就一定得记下来. 今天先讲讲数据库的主从同步,两个好处: 一是读写分离可以用上.比如 写操作就写到主 ...
- 设计模式(六):控制台中的“命令模式”(Command Pattern)
今天的博客中就来系统的整理一下“命令模式”.说到命令模式,我就想起了控制台(Console)中的命令.无论是Windows操作系统(cmd.exe)还是Linux操作系统(命令行式shell(Comm ...
- SQLCMD备忘录:执行文件夹所有Sql文件
在做性能测试的时候最希望的一件事情是数据自动导入. 一般做法就是写很多SQL文件,通过Bat自动执行所有Sql文件. Bat代码: @ECHO OFF SET SQLCMD="C:\Prog ...
- MySQL笔记---视图,存储过程, 触发器的使用入门
大二学数据库的时候,只是隐约听到老师提起过视图啊,存储过程啊,触发器啊什么的,但只是淡淡的记住了名字,后来自己做些小项目,小程序,也没有用上过,都只是简单的建表,关联表之类的,导致我对这些东西的理解只 ...
- TCP四种计时器
TCP共使用以下四种计时器,即重传计时器.坚持计时器.保活计时器和时间等待计时器 .这几个计时器的主要特点如下: 1.重传计时器 当TCP发送报文段时,就创建该特定报文段的重传计时 ...
- 在thinkphp中,写的博文标签多对多关系的标签频率统计算法
常常看到别人的博客里面,或者网站里面有这样随机颜色,但字体大小与标签出现频率有关的标签云,于是自己就想写一个.至于颜色的随机显示,那就很简单了,这里就不列代码. 因为正在学thinkphp,所以数据查 ...
- 细说Java主流日志工具库
概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息. 在Java世界,有很多的日志工具库来实现日志功能,避免了我们重复造轮子. 我们先来逐一了解一下主流日志工具. java.util ...