KMP 以及 border 性质的一些运用
一个 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 性质的一些运用的更多相关文章
- Border性质习题与证明
KMP 第一次接触 \(border\) 都是先从 KMP 开始的吧. 思想在于先对于一个串自匹配以求出 fail 指针(也就是 border) 然后就可以在匹配其他串的时候非常自然的失配转移.在此顺 ...
- [模板] KMP算法/Border
KMP 算法 KMP (Knuth-Morris-Pratt) 算法是一种在线性时间内匹配文本串和模式串的算法. 称字符串的 Border 集合为 \[ \operatorname {Border} ...
- [codeforces/gym/100431/E]KMP关于border的理解
题目链接:http://codeforces.com/gym/100431/ 考虑到对于一个串β,能cover它的最短的α必然是它的border的某个前缀,或者是这个β本身. 所谓border,就是n ...
- Border Theory
持续更新中!!!更个屁,无线停更! 前言: KMP 学傻了,看 skyh 说啥 border 树,跑来学 border 理论 洛谷云剪切板:https://www.luogu.com.cn/paste ...
- [KMP]【学习笔记】
Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 36916 Accepted: 14904 Descript ...
- UOJ Round #15 [构造 | 计数 | 异或哈希 kmp]
UOJ Round #15 大部分题目没有AC,我只是水一下部分分的题解... 225[UR #15]奥林匹克五子棋 题意:在n*m的棋盘上构造k子棋的平局 题解: 玩一下发现k=1, k=2无解,然 ...
- 【BZOJ1152】歌唱王国(生成函数,KMP)
[BZOJ1152]歌唱王国(生成函数,KMP) 题面 BZOJ 洛谷 题解 根据\(YMD\)论文来的QwQ. 首先大家都知道普通型生成函数是\(\displaystyle \sum_{i=0}^{ ...
- 【题解】歌唱王国(概率生成函数+KMP)+伦讲的求方差
[题解]歌唱王国(概率生成函数+KMP)+伦讲的求方差 生成函数的本质是什么呀!为什么和It-st一样神 设\(f_i\)表示填了\(i\)个时候停下来的概率,\(g_i\)是填了\(i\)个的时候不 ...
- [nfls338]基本字典子串
1.前置知识 以下数字未特殊说明,取值范围均与$N$取交 以下字符串未特殊说明,下标均从1开始,且均为非空串,复杂度中的$n$指字符串长度 周期和border 对于非空集合$S$,定义$\ ...
- 洛谷 P4548 - [CTSC2006]歌唱王国(概率生成函数)
洛谷题面传送门 PGF 入门好题. 首先介绍一下 PGF 的基本概念.对于随机变量 \(X\),满足 \(X\) 的取值总是非负整数,我们即 \(P(v)\) 表示 \(X=v\) 的概率,那么我们定 ...
随机推荐
- HanioTower(java)
package javaBasic; import java.util.Scanner; public class HanioTower { public static void main(Strin ...
- [极客大挑战 2019]FinalSQL 1
[极客大挑战 2019]FinalSQL 1 这篇主要是考察布尔盲注,而且他很贼,弄了两个输入框,但过滤的东西很多:真正的注入点在search.php传入的参数.说来惭愧,之前就做过布尔盲注的题目,结 ...
- Java四种引用类型回收时机介绍
每种编程语言都有操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过"引用"(reference).在 Java 中一切都被视作对象,但是我 ...
- 「Log」做题记录 2023.10.30-2023.11.26
\(2023.10.30-2023.11.5\) \(\color{blueviolet}{AT\_abc285\_g}\) 神秘题. 网络流是显著的,建边方式如下: 所有边容量都为 \(1\). 每 ...
- etcd详细介绍
一.etcd介绍 etcd是一个分布式.可靠的key-value存储的分布式系统,它不仅仅可以用于存储,还提供共享配置和服务发现.这里提供配置共享和服务发现的系统较多,比较常用的有zookeeper. ...
- [原创]《C#高级GDI+实战:从零开发一个流程图》第04章:来个圆形,连线它!
一.前言 上一节我们实现了在矩形与矩形之间添加连线,光是矩形太单调了,某些问题也暴露不出来,我们本节就来看一下,如何添加一个圆形,且支持圆形与圆形.圆形与矩形.矩形与矩形间的连线.在这个过程中我们会发 ...
- 使用 xUnit 快速编写 .NET 应用单元测试
前言 在当今快速迭代的软件开发环境中,单元测试已成为保障代码质量和项目可靠性的重要基石,通过验证程序最小单元(如函数.方法.类等)的独立行为,能够在开发阶段快速发现逻辑错误或边界条件问题.今天大姚将带 ...
- 用 Tarjan 算法求解无向图的割点和割边
上期回顾:https://www.cnblogs.com/ofnoname/p/18823922 Tarjan 算法与无向图 连接性分析是图论的核心,而Tarjan算法为我们提供了穿透复杂网络结构的通 ...
- flex横向对齐即两端有靠右
flex布局怎么再设置子元素两侧对其的情况下设置最后一行左对齐 .container { display: flex; flex-wrap: wrap; justify-content: space- ...
- sox 音频转换不求人 amixer 是alsa的命令行工具,对于声卡的参数的配置.
在线音频转换,奈何公司的网速太慢,一个mp3 转换成的wav 的大小几乎会达到12M 其实sox可以很无脑的完成这些操作 sox 1.mp3 1.wav sox 1.mp3 1.ogg sox几乎支持 ...