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

明明昨天的题我都知道怎么模拟了,但是还是不会改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. centos下无法直接删除乱码文件及文件夹解决方案

    不知道怎么回事今天在系统上发现有一个名字为“\”的文件,使用rm -f \ 无法删除,最后没办法只能使用文件的inode号进行删除,以下是相关步骤: [oracle@prod-db ~]$ ls -i ...

  2. T-SQL查询高级—SQL Server索引中的碎片和填充因子

        写在前面:本篇文章需要你对索引和SQL中数据的存储方式有一定了解.标题中高级两个字仅仅是因为本篇文章需要我的T-SQL进阶系列文章的一些内容作为基础. 简介 在SQL Server中,存储数据 ...

  3. Ecshop首页购物车数量调取问题

    在page_header.lbi中调用SQL: <?php $sql = 'SELECT SUM(goods_number) AS number' . ' FROM ' . $GLOBALS[' ...

  4. [BZOJ4327]:[JZOI2012]玄武密码(AC自动机)

    题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此.  ...

  5. python 函数内使用全局变量

    x = def change_global(): global x x = x + change_global() print(x) result: 2

  6. VMware的centos的配置分区

    /      ext3 8189 固定大小空     swap 509  固定大小/boot  ext3 100  固定大小/home  ext3 全部(使用全部可用空间) 利用的工具   AMFTP ...

  7. VMware9虚拟机安装MAC OS X Mountain Lion 10.8.2详细图文教程

    VMware虚拟机安装Mac OS X Mountain Lion 10.8.2所需文件:1.Vmware 9.01版下载:点击进入2.Vmware 9.01版汉化文件:点击进入3.VMware Wo ...

  8. 配置淘宝镜像,不使用怪异的cnpm

    npm config set registry https://registry.npm.taobao.org --global npm config set disturl https://npm. ...

  9. NOIP模拟赛 麻将

    [题目描述] 众所周知,麻将是我们国家的国粹.这段时间,小D也迷上了麻将这个老少皆宜的游戏. 小D觉得这些不同规则的麻将太麻烦了,所以他集合了很多种麻将规则创造出了一套D麻将.下面是D麻将的几个特点: ...

  10. Angular - Can't bind to 'ngModel' since it isn't a known property of 'input'.

    用[(ngModel)]="xxx"双向绑定,如:控制台报错:Can't bind to 'ngModel' since it isn't a known property of ...