Z 函数
简单记一下,避免忘记。
z 函数
对于字符串 \(S\),我们将 \(z(i)\) 定义为从 \(i\) 开始的后缀与 \(S\) 的最长公共前缀的长度。
\(O(n)\) 求出 z 函数
我们添加一个分隔符,将 \(S\) 的真正下标变为从 1 开始。此时显然 \(z(1)=n\)。
我们需要 \(r\) 最大的匹配串 \(S[l:r]\) ,即为当前最大的 \(l+z(l)-1\) 。
如果 \(i > r\),显然此时任何之前的 \(z(j)\) 都无法对其提供贡献,所以只能从 \(0\) 开始求。
如果 \(i \le r\),由于 \(S[l:r]\) 与 \(S\) 的前缀匹配,所以 \(S[i-l+1:r-l+1]=S[i:r]\)。但我们并不知道 \(S\) 的前缀与 \(S[i:r]\) 的关系。
根据 z 函数的定义我们可知:\(S[1:1 + z(i-l+1)-1] = S[i-l+1:i-l+1+z(i-l+1)-1]\)
所以实际上我们能确定的相同的只有 \(z(i-l+1)\) 的长度相同。
我们还需要额外考虑一件事:\(i+z(i-l+1)-1\) 是有可能大于 \(r\) 的。但此时我们连第一个等式都不确定了,所以大于的部分并不确定相不相等。所以 \(z(i)\) 最大初始化长度不能超过 \(r-i+1\)。
注意求出 \(z(i)\) 后更新 \(l\) 和 \(r\)。
Z 函数的更多相关文章
- luogu P5410 模板 扩展 KMP Z函数 模板
LINK:P5410 模板 扩展 KMP Z 函数 画了10min学习了一下. 不算很难 思想就是利用前面的最长匹配来更新后面的东西. 复杂度是线性的 如果不要求线性可能直接上SA更舒服一点? 不管了 ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- exkmp(Z函数) 笔记
exkmp 用于求解这样的问题: 求文本串 \(T\) 的每一个后缀与模式串 \(M\) 的匹配长度(即最长公共前缀长度).特别的,取 \(M=T\),得到的这个长度被称为 \(Z\) 函数.&quo ...
- Atcoder Regular Contest 058 D - 文字列大好きいろはちゃん / Iroha Loves Strings(单调栈+Z 函数)
洛谷题面传送门 & Atcoder 题面传送门 神仙题. mol 一发现场(bushi)独立切掉此题的 ycx %%%%%%% 首先咱们可以想到一个非常 naive 的 DP,\(dp_{i, ...
- 前缀函数与Z函数介绍
字符串算法果然玄学=_= 参考资料: OI Wiki:前缀函数与KMP算法 OI Wiki:Z函数(扩展KMP) 0. 约定 字符串的下标从 \(0\) 开始.\(|s|\) 表示字符串 \(s\) ...
- KMP&Z函数详解
KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...
- KMP 与 Z 函数
\(\text{By DaiRuiChen007}\) 一.KMP 算法 I. 问题描述 在文本串 \(S\) 中找到模式串 \(T\) 的所有出现,其中 \(|S|=n,|T|=m\) II. 前置 ...
- Python高手之路【三】python基础之函数
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
- 我的MYSQL学习心得(六) 函数
我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...
- mysql函数大全
对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql& ...
随机推荐
- kafka常用命令(zookeeper与bootstrap-server)
在 0.9.0.0 之后的 Kafka,出现了几个新变动,一个是在 Server 端增加了 GroupCoordinator 这个角色,另一个较大的变动是将 topic 的 offset 信息由之前存 ...
- 项目脚手架之webpack
分享版本: webpackV4.X (企企项目PC端-webpack: 4.29.6.webpack-cli: 3.1.1) 分享初衷: 本文我们结合企企项目(下面相关代码片段主要取至我们项目) ...
- POJ--2386题C++实现
本题利用深度遍历的穷竭搜索法进行解题,即对每一个元素都对其进行各个方向的深度遍历,穷尽其周围 #include<iostream>#include<cstdio>using n ...
- 基于Python接口自动化测试持续集成----在jenkins创建任务->检出git的代码-->生成报告-->发送邮件
步骤一:先在jenkins创建一个自由风格的任务 步骤二:然后在源码管理选择git检出代码的方式,需要提供代码所在git的路径和登录git的账号和密码 步骤三:返回到任务配置的界面,先在构建后操作增加 ...
- C# 自定义组元扩展类(Tuple)
组元Tuple没有构造函数,自定义一个有构造函数的组元TupleEx. namespace TupleEx { public class TupleEx<T1> { /// <sum ...
- vue element tree 上移下移
效果图 需求是:上边没有了应该取最后一个 下边没有了 应该取第一个 直接上代码: <template> <el-tree :key="tree_key" v ...
- vue3 ts vite
npm init vite@latest npm install -D sassnpm i vantnpm i vite-plugin-style-import@1.4.1 -Dvite.config ...
- GIMP选择,GIMP画布大小,GIMP图层
基本概念 1. 画布 2. 图层 你只能操作一个图层--就是你选中的.就看起来所有的图像都在一起,但是不同的图层中的图像是不同,不能操作没有选中的图层. 对于选择操作,要注意你选中的图层. 要获取图像 ...
- grub-mkrescue:错误: `mformat` invocation failed
跟着兴业视频做操作系统的时候遇到了这个问题 解决方法: sudo apt-get install mtools 参考: (40条消息) vs code连接远程Ubuntu编写操作系统,grub-mkr ...
- Echart 属性解析
<template> <div class="container"> <div id="myEchart" style=" ...