简单记一下,避免忘记。

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 函数的更多相关文章

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

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

  2. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  3. exkmp(Z函数) 笔记

    exkmp 用于求解这样的问题: 求文本串 \(T\) 的每一个后缀与模式串 \(M\) 的匹配长度(即最长公共前缀长度).特别的,取 \(M=T\),得到的这个长度被称为 \(Z\) 函数.&quo ...

  4. Atcoder Regular Contest 058 D - 文字列大好きいろはちゃん / Iroha Loves Strings(单调栈+Z 函数)

    洛谷题面传送门 & Atcoder 题面传送门 神仙题. mol 一发现场(bushi)独立切掉此题的 ycx %%%%%%% 首先咱们可以想到一个非常 naive 的 DP,\(dp_{i, ...

  5. 前缀函数与Z函数介绍

    字符串算法果然玄学=_= 参考资料: OI Wiki:前缀函数与KMP算法 OI Wiki:Z函数(扩展KMP) 0. 约定 字符串的下标从 \(0\) 开始.\(|s|\) 表示字符串 \(s\) ...

  6. KMP&Z函数详解

    KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其 \(前缀函数\) ...

  7. KMP 与 Z 函数

    \(\text{By DaiRuiChen007}\) 一.KMP 算法 I. 问题描述 在文本串 \(S\) 中找到模式串 \(T\) 的所有出现,其中 \(|S|=n,|T|=m\) II. 前置 ...

  8. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  9. 我的MYSQL学习心得(六) 函数

    我的MYSQL学习心得(六) 函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  10. mysql函数大全

    对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL,返回NULL. mysql& ...

随机推荐

  1. MySQL经典45题

    一.数据库字段说明 1.学生表 Student(SId,Sname,Sage,Ssex)SId :学生编号Sname:学生姓名Sage :出生年月Ssex:学生性别 2.课程表 Course(CId, ...

  2. 实验: spring-boot 整合 fluent-mybatis 实验过程!!!!

    1.参考: 简单整合,会报错误 https://segmentfault.com/a/1190000040467885?utm_source=sf-similar-article 利用maven编译, ...

  3. pycharm 导入requests库踩坑帖

    requests库确认安装了,但是在pycharm里各种导入不了,简直要奔溃,后来看帖子,有博主"alt + enter"了一下,跳出了install选项,然后就可以了... 用个 ...

  4. Jmeter添加JSR223对Python的支持

    通过下载:org.python : jython-standalone : 2.7.2 - Maven Central Repository Search jython-standalone-2.7. ...

  5. elasticsearch 根据主键_id更新部分字段

    package com.better517na.ebookingbusiservice.helper;import com.alibaba.fastjson.JSON;import com.aliba ...

  6. Mixly呼吸灯及可调灯(物联网)

    3挡可调灯 2秒呼吸灯

  7. SQL server——基础篇之数据完整性

    定义:保证数据库中的数据在逻辑上的一致性.正确性和可靠性. 作用:防止无效数据或错误数据进入数据库 数据完整性包括:实体完整性.域完整性和参照完整性 实体完整性 规定表的每一行记录在表中是唯一的 实体 ...

  8. java中锁的应用(ReentrantLock)

    package com.xielu.test; public class explicit { private static Lock lock = new ReentrantLock(); priv ...

  9. nginx日志分析--可视化

    1. 安装依赖 yum install glib2 glib2-devel GeoIP-devel ncurses-devel zlib zlib-devel -y wget https://gith ...

  10. mongoose Schema字段的含义

    var schema3 = new Schema({ test: { type: String, lowercase: true, // 总是将test的值转化为小写 uppercase: true, ...