学一把看毛片算法我觉得自己才能变得更加出色

明明昨天的题我都知道怎么模拟了,但是还是不会改KMP,是我学丑了

KMP是Knuth-Morris-Pratt三人设计的线性时间字符串匹配算法

nxt数组的介绍,卧槽,直接找到太爽啦

就是我匹配的时候是可以回退的,因为字符的肯能性有限

比如aaaaaaaaab和aaaab进行匹配,aaaab是模式串,aaaaaaaaab是匹配串,我就不用回退那么多次数,因为及时往下推就好了

我匹配了一部分我就能回退到一定的位置

下面是一段演示

我用的求前缀函数

void pre(char *p)
{
int i,m,j;
m=strlen(p+1);
nex[]=nex[]=;
for(int i=; i<m; i++)
{
j=nex[i];
while(j&&p[i]!=p[j])j=nex[j];
nex[i+]=p[i]==p[j]?j+:;
}
}

aaaab

0 0 1 2 3

aba

0 0 0

就是在字符串匹配时可以回退,因为这些字符和前缀是相同的,所以直接回退就可以的

匹配不成功得到的j值

换一组数据

直接匹配就没有回退了

解释下这个复杂些的,就是我往下走啊,但是但匹配到模式串5发现不能继续了,还有两次到2就不能继续了,窝看看nxt可不可以少做些

用来测试的代码

#include <bits/stdc++.h>
using namespace std;
const int N=;
char s[N],t[N];
int nxt[N],sum[N];
void pre(char *p)
{
int i,m,j;
m=strlen(p+);
nxt[]=nxt[]=;
for(int i=; i<m; i++)
{
j=nxt[i];
while(j&&p[i]!=p[j])j=nxt[j];
nxt[i+]=p[i]==p[j]?j+:;
}
}
void KMP(char *a,char *b){
pre(b);
int j=;
int len1=strlen(a+);
int len2=strlen(b+);
for(int i=;i<=len1;i++){
while(j&&a[i]!=b[j+])
{printf("%d ",j);j=nxt[j];}
if(a[i]==b[j+]) j++;
if(j==len2){
printf("\na[%d~%d]==b\n",i-len2+,i);
j=nxt[j];
}
}
}
int main()
{
scanf("%s",s+);
scanf("%s",t+);
KMP(s,t);
return ;
}

我的模板

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
char s[N],t[N];
int nxt[N];
void pre(char *t)
{
int i=,j=-;
nxt[]=-;
while(t[i])
{
if(j==-||t[i]==t[j])
{
i++,j++;
if(t[i]!=t[j])nxt[i]=j;
else nxt[i]=nxt[j];
}
else j=nxt[j];
}
}
int KMP(char *s,char *t)
{
pre(t);
int i=,j=;
while(s[i])
{
if(j==-||s[i]==t[j])i++,j++;
else j=nxt[j];
}
return j;
}
int main()
{ return ;
}

伪代码

KMP-MATCHER(T, P)
1 nlength[T]
2 mlength[P]
3 π ← COMPUTE-PREFIX-FUNCTION(P)
4 q ← 0 ▹Number of characters matched.
5 for i ← 1 to n ▹Scan the text from left to right.
6 do while q > 0 and P[q + 1] ≠ T[i]
7 do q ← π[q] ▹Next character does not match.
8 if P[q + 1] = T[i]
9 then qq + 1 ▹Next character matches.
10 if q = m ▹Is all of P matched?
11 then print "Pattern occurs with shift" i - m
12 q ← π[q] ▹Look for the next match.
COMPUTE-PREFIX-FUNCTION(P)
1 mlength[P]
2 π[1] ← 0
3 k ← 0
4 for q ← 2 to m
5 do while k > 0 and P[k + 1] ≠ P[q]
6 do k ← π[k]
7 if P[k + 1] = P[q]
8 then kk + 1
9 π[q] ← k
10 return π

KMP算法入门的更多相关文章

  1. 【面向打野编程】——KMP算法入门

    一.问题 咱们先不管什么KMP,来看看怎么匹配两个字符串. 问题:给定两个字符串,求第二个字符串是否包含于第一个字符串中. 为了具体化,我们以 ABCAXABCABCABX 与 ABCABCABX为例 ...

  2. 【初识】KMP算法入门(转)

    感觉写的很好,尤其是底下的公式,易懂,链接:http://www.cnblogs.com/mypride/p/4950245.html 举个例子 模式串S:a s d a s d a s d f a  ...

  3. 【初识】KMP算法入门

    举个例子 模式串S:a s d a s d a s d f a s d 匹配串T:a s d a s d f 如果使用朴素匹配算法—— 1 2 3 4 5 6  8 9 a s d a s d a s ...

  4. KMP算法入门讲解

    字符串匹配问题.假设文本是一个长度为$n$的字符串$T$,模板是一个长度为$m$的字符串$P$,且$m\leq n$.需要求出模板在文本中的所有匹配点$i$,即满足$T[i]=P[0],T[I+1]= ...

  5. KMP算法——从入门到懵逼到了解

    本博文參考http://blog.csdn.net/v_july_v/article/details/7041827 关于其它字符串匹配算法见http://blog.csdn.net/WINCOL/a ...

  6. KMP算法之从懵逼到入门

    写本文的目的: 1.加深自己的理解,以便自己日后复习 2.给看到此文的人一点启发 KMP算法看懂了就觉得特别简单,思路也好理解,但是看不懂之前,查各种资料看大佬的博客,都很懵逼...... 1.  算 ...

  7. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  8. KMP算法的Next数组详解

    转载请注明来源,并包含相关链接. 网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初我入门时看的博客吧:http://www.cnblogs.com/yjiyjige/p/32 ...

  9. 【转】KMP算法

    转载请注明来源,并包含相关链接.http://www.cnblogs.com/yjiyjige/p/3263858.html 网上有很多讲解KMP算法的博客,我就不浪费时间再写一份了.直接推荐一个当初 ...

随机推荐

  1. 2015 ACM/ICPC Asia Regional Changchun Online Pro 1008 Elven Postman (BIT,dfs)

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...

  2. VMware vSphere6.0 服务器虚拟化部署安装图解

    一 VMware vSphere部署的前期规划要点 1 vSphere的优点 (略) 2 如何利用现在的设备架构虚拟化环境 在虚拟化过程中,用户大多会考虑目前现有的服务器.存储.交换机等基础设备是否可 ...

  3. 01_1JAVA简介

    01_1JAVA简介 1. Java基础 语法基础.OO.Exception.Array.基础类.I/O Stream.Collection /Generic.Thread.TCP/UDP.GUI.M ...

  4. d3网址

    官网: http://d3js.com D3创始人 http://bost.ocks.org.mike 教程: http://www.dashingd3js.com/table-of-contents ...

  5. Codevs3324 新斯诺克

    题目描述 Description 斯诺克又称英式台球,是一种流行的台球运动.在球桌上,台面四角以及两长边中心位置各有一个球洞,使用的球分别为1 个白球,15 个红球和6 个彩球(黄.绿.棕.蓝.粉红. ...

  6. 使用虚拟环境来管理python的包

    1.背景 在开发python项目的过程中,我们会用到各种各样的包,我们使用pip来管理包,请看下图我们刚装好python解释器时已安装的包: 但是随着我们疯狂的使用pip install xxx后,系 ...

  7. Ubuntu Server 18.04 LTS安装

    Please choose your preferred language. 选择您喜欢的语言 这里直接选择[English] Keyboard configuration 键盘配置 Please s ...

  8. 批量ping IP并检测IP延迟率和丢包率脚本

    脚本文件如下: #!/bin/bash #Author:Mr.Ding #Created Time:2018-08-26 07:23:44 #Name:ping.sh #Description: sh ...

  9. destoon ip接口失效修改 修改后偶尔会加载很慢

    因为百度ip转换增加了密匙验证,所以导致之前的接口无法再转换ip地址的信息,修复方法如下:打开include\cloud.func.php文件搜索: function iplookup($ip) { ...

  10. setup/hold 分析

    分析说明:D2:目的寄存器:D1:源寄存器: edge2:下一个时钟上升沿:edge1:当前时钟上升沿:edge0:当前时钟上升沿的前一个时钟沿:如下图: 建立时间:触发器D2(数据要到达目的的地方) ...