一、kmp算法

1、基本概念

  • 模式串:P
  • 匹配串:T
  • kmp算法精髓:找打一个最大的x,使得T[s+1,...,s+k]的后x个字符,和P的前x个字符相同。
2、next数组

next数组:记录模式串最长公共前后缀

3、相关代码
//求next数组伪代码
next[1] = 0
k = 0
for i = 2 to len(P):
while(k > 0) and (p[k + 1] != p[i]):
k = next[k]
if(p[k + 1] == p[i]):
k++
next[i]= k //模式串与匹配串匹配伪代码
j = 0 //模式串P的下标
for i = 1 to len(T)://匹配串T的下标
while(j > 0) and (T[i] != p[j + 1]):
j = next[j]
if T[i] == P[j + 1]:
j ++
if j == len(P):
printf("match")
j = next[j]

二、Z算法

1、z函数
  • 对于一个字符串S和一个下标i(i > 1),令Z[i]表示S和S[i,...,|S|]的最长公共前缀
    0 1 2 3 4 5 6 7 8 9
S = a a b c c a a b x a
Z[5] = 3
Z[6] = 1
Z[7] = 0
2、z box

3、z算法

代码部分
//初始化Z[],暴力计算Z[2]
for(int i = 1; i <= n; i++) z[i] = 0;
int l, r;
while(st[1 + z[2]] == st[2 + z[2]]) z[2] ++;
l = 2, r = l + z[2];
//枚举i,分三种情况依次计算Z[i]
for(int i = 3; i <= n; i++){
if(i > r){
while(st[l + z[i]] == st[i + z[i]]) z[i] ++;
l = i, r = i + z[i] - 1;
}
else{
if(z[i - l + 1] < r - i + 1) z[i] = z[i - l + 1];
else{
z[i] = r - i;
while(st[l + z[i]] == st[i + z[i]]) z[i] ++;
l = i, r = i + z[i] - 1;
}
}
}

kmp、z算法、exkmp的更多相关文章

  1. Z算法

    Z算法 Z算法是一种用于字符串匹配的算法.此算法的核心在于\(z\)数组以及它的求法. (以下约定字符串下标从\(1\)开始) \(\bm z\)数组和Z-box 定义\(z\)数组:\(z_{a,i ...

  2. 【算法】字符串匹配之Z算法

    求文本与单模式串匹配,通常会使用KMP算法.后来接触到了Z算法,感觉Z算法也相当精妙.在以前的博文中也有过用Z算法来解决字符串匹配的题目. 下面介绍一下Z算法. 先一句话讲清楚Z算法能求什么东西. 输 ...

  3. CF #93 div1 B. Password KMP/Z

    题目链接:http://codeforces.com/problemset/problem/126/B 大意:给一个字符串,问最长的既是前缀又是后缀又是中缀(这里指在内部出现)的子串. 我自己的做法是 ...

  4. CodeForces - 1051E :Vasya and Big Integers(Z算法 & DP )

    题意:给定字符串S,A,B.现在让你对S进行切割,使得每个切割出来的部分在[A,B]范围内,问方案数. 思路:有方程,dp[i]=Σ dp[j]   (S[j+1,i]在合法范围内).    假设M和 ...

  5. luogu P5410 模板 扩展 KMP Z函数 模板

    LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...

  6. KMP串匹配算法解析与优化

    朴素串匹配算法说明 串匹配算法最常用的情形是从一篇文档中查找指定文本.需要查找的文本叫做模式串,需要从中查找模式串的串暂且叫做查找串吧. 为了更好理解KMP算法,我们先这样看待一下朴素匹配算法吧.朴素 ...

  7. KMP(Knuth-Morris-Pratt)算法

    一.朴素匹配算法 也就是暴力匹配算法.设匹配字符串的长度为n,模式串的长度为m,在最坏情况下,朴字符串匹配算法执行时间为O((n - m + 1)m). 假设m = n / 2, 那么该算法的复杂度就 ...

  8. Codeforces 126B Password(Z算法)

    题意 给定一个字符串 \(s\) ,求一个子串 \(t\) 满足 \(t\) 是 \(s\) 的前缀.后缀且在除前缀后缀之外的地方出现过. \(1 \leq |s| \leq 10^6\) 思路 \( ...

  9. Z算法板子

    给定一个串$s$, $Z$算法可以$O(n)$时间求出一个$z$数组 $z_i$表示$s[i...n]$与$s$的前缀匹配的最长长度, 下标从$0$开始 void init(char *s, int ...

  10. 算法笔记--KMP算法 && EXKMP算法

    1.KMP算法 这个博客写的不错:http://www.cnblogs.com/SYCstudio/p/7194315.html 模板: next数组的求解,那个循环本质就是如果相同前后缀不能加上该位 ...

随机推荐

  1. [转帖]JVM 输出 GC 日志导致 JVM 卡住,我 TM 人傻了

    https://www.jianshu.com/p/51380e04eab1 最近,我们升级了 Java 17.后来,我们的 k8s 运维团队为了优化我们的应用日志采集, 将我们所有 pod (你可以 ...

  2. [转帖]Windows自带MD5 SHA1 SHA256命令行工具

    https://www.cnblogs.com/huangrt/p/13961399.html 检验工具http://www.zdfans.com/html/4346.html HashMyFiles ...

  3. [转帖]goproxy的设置

    goproxy.io 是全球最早的 Go modules 镜像代理服务之一 [大陆地区建议使用 proxy.golang.com.cn],采用 CDN 加速服务为开发者提供依赖下载, 该服务由一批热爱 ...

  4. [转帖]Kubernetes-18:Dashboard安装及使用

    https://www.cnblogs.com/v-fan/p/13950268.html Helm安装Dashboard 简介 Dashboard 是 kubernetes 的图形化管理工具,可直观 ...

  5. [转帖]分享一个Navicat16最新版永久试用的办法

    https://zhuanlan.zhihu.com/p/614621302 新建bat,就叫 navicat无限试用.bat @echo off echo Delete HKEY_CURRENT_U ...

  6. 【转帖】基于paramiko的二次封装

    https://www.jianshu.com/p/944674f44b24 paramiko 是 Python 中的一个用来连接远程主机的第三方工具,通过使用 paramiko 可以用来代替以 ss ...

  7. [转帖]优化超大 Nginx 配置导致的内存碎片

    https://blog.openresty.com.cn/cn/ngx-cycle-pool-frag/?src=org_news 章亦春发布于 Feb 14, 2023更新于 Mar 2, 202 ...

  8. 【转贴】java 进程运行状态图解

    java 进程运行状态图解   原文博客地址 https://www.cnblogs.com/GooPolaris/p/8079490.html java中进程的状态有 6 种: NEW(新建).RU ...

  9. Fabric区块链浏览器(1)

    本文是区块链浏览器系列的第三篇,本文介绍区块链浏览器的主体部分,即区块数据的解析. 这一版本的区块链浏览器是基于gin实现的,只提供三种接口: /block/upload:POST,上传Protobu ...

  10. 开源即时通讯(IM)项目OpenIM源码部署流程

    由于 OpenIM 依赖的组件较多,开发者需求不一,导致 OpenIM 部署一直被人诟病,经过几次迭代优化,包括依赖的组件 compose 的一键部署,环境变量设置一次,全局生效,以及脚本重构,目前 ...