一个 kmp 学了 \(n\) 遍终于学懂的屑菜 bot。

下文默认文本串为 \(s\),模式串为 \(t\)。

前缀函数

定义

\(\pi_i\) 表示前缀为 \(i\) 的子串中的最长公共前后缀(border)长度。

求取

暴力

\(O(n ^ 3)\) 去暴力枚举。

高效算法

第一个重要的观察是相邻的前缀函数值至多增加 \(1\)

那么我们就是要往前查找一个尽可能大的 \(\pi\) 满足其往后一位仍然能匹配,或直到 border 长度为 \(0\)。

具体地可以依照这个视频来看,讲得非常详细。

模板

不难发现实现起来非常之短。

n = s.size(), m = t.size();

	s = t + '?' + s;

	for(int i = 1, j = nxt[i - 1] ; i < (int)s.size() ; ++ i) {
while(j && s[i] != s[j]) j = nxt[j - 1]; if(s[i] == s[j]) {
nxt[i] = ++ j; if(nxt[i] == m) cout << i - m * 2 + 1 << '\n', j = nxt[j - 1];
}
}

KMP

不难发现,将文本串接在模式串后,中间隔一个特殊字符,若出现 \(\pi_i = |t|\) 的情况则说明匹配成功了。

例题

CF126B

如图,pos 为当前枚举到的位置,红色部分和蓝色部分为 \([1, pos]\) 的 border,那么不难发现红 = 蓝 = 绿。

正序、倒序各求一遍 border 即可。

for(int i = 2 ; i < n ; ++ i)
if(nxt[i][0] == nxt[n - i + nxt[i][0]][1])
if(nxt[i][0] > ans) {
ans = nxt[i][0]; pos = i;
} if(! ans) cout << "Just a legend";
else
for(int i = 0 ; i < nxt[pos][0] ; ++ i)
cout << s[i];

KMP 以及 border 性质的一些运用的更多相关文章

  1. Border性质习题与证明

    KMP 第一次接触 \(border\) 都是先从 KMP 开始的吧. 思想在于先对于一个串自匹配以求出 fail 指针(也就是 border) 然后就可以在匹配其他串的时候非常自然的失配转移.在此顺 ...

  2. [模板] KMP算法/Border

    KMP 算法 KMP (Knuth-Morris-Pratt) 算法是一种在线性时间内匹配文本串和模式串的算法. 称字符串的 Border 集合为 \[ \operatorname {Border} ...

  3. [codeforces/gym/100431/E]KMP关于border的理解

    题目链接:http://codeforces.com/gym/100431/ 考虑到对于一个串β,能cover它的最短的α必然是它的border的某个前缀,或者是这个β本身. 所谓border,就是n ...

  4. Border Theory

    持续更新中!!!更个屁,无线停更! 前言: KMP 学傻了,看 skyh 说啥 border 树,跑来学 border 理论 洛谷云剪切板:https://www.luogu.com.cn/paste ...

  5. [KMP]【学习笔记】

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36916   Accepted: 14904 Descript ...

  6. UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]

    UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...

  7. 【BZOJ1152】歌唱王国(生成函数,KMP)

    [BZOJ1152]歌唱王国(生成函数,KMP) 题面 BZOJ 洛谷 题解 根据\(YMD\)论文来的QwQ. 首先大家都知道普通型生成函数是\(\displaystyle \sum_{i=0}^{ ...

  8. 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差

    [题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...

  9. [nfls338]基本字典子串

    1.前置知识 以下数字未特殊说明,取值范围均与$N$​​​取交 以下字符串未特殊说明,下标均从1开始,且均为非空串,复杂度中的$n$​​​指字符串长度 周期和border 对于非空集合$S$,定义$\ ...

  10. 洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)

    洛谷题面传送门 PGF 入门好题. 首先介绍一下 PGF 的基本概念.对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定 ...

随机推荐

  1. HanioTower(java)

    package javaBasic; import java.util.Scanner; public class HanioTower { public static void main(Strin ...

  2. [极客大挑战 2019]FinalSQL 1

    [极客大挑战 2019]FinalSQL 1 这篇主要是考察布尔盲注,而且他很贼,弄了两个输入框,但过滤的东西很多:真正的注入点在search.php传入的参数.说来惭愧,之前就做过布尔盲注的题目,结 ...

  3. Java四种引用类型回收时机介绍

       每种编程语言都有操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过"引用"(reference).在 Java 中一切都被视作对象,但是我 ...

  4. 「Log」做题记录 2023.10.30-2023.11.26

    \(2023.10.30-2023.11.5\) \(\color{blueviolet}{AT\_abc285\_g}\) 神秘题. 网络流是显著的,建边方式如下: 所有边容量都为 \(1\). 每 ...

  5. etcd详细介绍

    一.etcd介绍 etcd是一个分布式.可靠的key-value存储的分布式系统,它不仅仅可以用于存储,还提供共享配置和服务发现.这里提供配置共享和服务发现的系统较多,比较常用的有zookeeper. ...

  6. [原创]《C#高级GDI+实战:从零开发一个流程图》第04章:来个圆形,连线它!

    一.前言 上一节我们实现了在矩形与矩形之间添加连线,光是矩形太单调了,某些问题也暴露不出来,我们本节就来看一下,如何添加一个圆形,且支持圆形与圆形.圆形与矩形.矩形与矩形间的连线.在这个过程中我们会发 ...

  7. 使用 xUnit 快速编写 .NET 应用单元测试

    前言 在当今快速迭代的软件开发环境中,单元测试已成为保障代码质量和项目可靠性的重要基石,通过验证程序最小单元(如函数.方法.类等)的独立行为,能够在开发阶段快速发现逻辑错误或边界条件问题.今天大姚将带 ...

  8. 用 Tarjan 算法求解无向图的割点和割边

    上期回顾:https://www.cnblogs.com/ofnoname/p/18823922 Tarjan 算法与无向图 连接性分析是图论的核心,而Tarjan算法为我们提供了穿透复杂网络结构的通 ...

  9. flex横向对齐即两端有靠右

    flex布局怎么再设置子元素两侧对其的情况下设置最后一行左对齐 .container { display: flex; flex-wrap: wrap; justify-content: space- ...

  10. sox 音频转换不求人 amixer 是alsa的命令行工具,对于声卡的参数的配置.

    在线音频转换,奈何公司的网速太慢,一个mp3 转换成的wav 的大小几乎会达到12M 其实sox可以很无脑的完成这些操作 sox 1.mp3 1.wav sox 1.mp3 1.ogg sox几乎支持 ...