字符串算法
文章平均质量分 74
字符串算法
爱寂寞的时光
这个作者很懒,什么都没留下…
展开
-
字符串——后缀数组
字符串——后缀数组后缀数组记字符串 SSS 的后缀字符串 sis_isi 为 S[i…n]S[i \ldots n]S[i…n] 即以 iii 为起点的后缀,将所有的后缀字符串按照字典序进行排序,得到后缀数组,后缀数组主要包含两个:sa[i]sa[i]sa[i] 排名为 iii 的后缀字符串的起点。rk[i]rk[i]rk[i] 以 iii 为起点的后缀字符串的排名。后缀排序一种朴素的后缀排序算法的时间复杂度是 O(n2logn)O(n^2 \log n)O(n2logn) 的,通过使用原创 2022-03-24 16:18:42 · 262 阅读 · 0 评论 -
字符串——二维矩阵Hash
字符串——二维矩阵Hash本文介绍的是一种关于二维矩阵Hash的方法,用于在O(1)O(1)O(1)的时间内求出子矩阵的Hash值。NC 51003构造for (int r = 1; r <= n; r++) for (int c = 1; c <= m; c++) m_hash[r][c] = (m_hash[r][c - 1] * HASH_BASE % HASH_MOD + matrix[r][c]) % HASH_MOD;首先对行取多项式,即:rha原创 2021-11-19 22:24:55 · 320 阅读 · 0 评论 -
字符串——广义&二维KMP
字符串——广义&二维KMP广义KMP普通KMP是关于字符序列的一种模式匹配算法,而广义KMP将字符序列推广到一般序列,即带有等价关系的序列均可以进行广义KMP算法。即我们只需要定义序列中的元素是否相等或不相等,即可像普通KMP一样执行广义KMP算法。二维KMP广义KMP的一种特殊实现就是二维KMP,在二维KMP中的序列元素就是字符串。例如序列{“abcd”,“addfd”,“dwffas”},我们可以定义字符串相等,那么就可以在字符串序列上执行广义KMP算法,即二维KMP算法。POJ 2原创 2021-11-06 16:31:59 · 439 阅读 · 0 评论 -
字符串字典序
字符串字典序设字母集为∑\sum∑(通常为小写字母),∑∗\sum^*∑∗ 为表示包含所有有限长度的字符串的集合,该字符串是由字母表∑\sum∑中字符组成的,而字典序是定义在∑∗\sum^*∑∗上的一个偏序关系。设两个字符串为aaa与bbb,则两个字符串的大小关系为:令i=1i=1i=1。若i≤min{∣a∣,∣b∣}i \leq \min\{|a|,|b|\}i≤min{∣a∣,∣b∣}比较a[i]a[i]a[i]和b[i]b[i]b[i]之间的关系,若a[i]<b[i]a[i] <原创 2021-10-31 16:08:12 · 2292 阅读 · 0 评论 -
AC自动机
AC自动机AC自动机(Aho-Corasick Automaton)作为一种KMP的扩展算法,可以在多个模式串的条件下完成对文本串的匹配。基本原理AC自动机的底层数据类型是Tire字典树,底层算法为KMP匹配算法,故阅读此文需要Tire树和KMP算法作为前置知识学习。AC自动机的核心本质还是自动机,主要构建一个状态转移函数P[u][v]P[u][v]P[u][v],表示状态uuu读取到字符vvv的下一个状态。例如,当我们发现G失配之后,我们会进行状态转移,放弃当前模式串匹配,转移到另外一个模式串原创 2021-05-19 21:34:52 · 191 阅读 · 0 评论 -
Manacher算法
Manacher算法给定一个字符串,要求求出字符串中所有的回文字串。Manacher算法给出了一个线性时间算法。过程回文串分为奇回文串和偶回文串,而奇回文串操作比较优雅。故先介绍奇回文串的Manacher算法。源字符串为t[i]t[i]t[i],定义数组p[i]p[i]p[i],代表以字符t[i]t[i]t[i]为中心,回文子串的最大半径,例如:Manacher算法其实是一种动态规划算法,核心在于如何利用已经计算出的ppp值去推导没有计算出的ppp值。接下来,我们要维护一段区间,变量l,rl,原创 2021-04-08 19:43:55 · 523 阅读 · 0 评论 -
Tire字典树
Tire字典树作用Tire字典树在处理海量字符串数据具有极高的效率,O(n)O(n)O(n)时间预处理nnn为初始化字符串集合的大小,O(m)O(m)O(m)时间查询,mmm为查询字符串长度。原理字典树(Trie)是一个比较简单的数据结构,也叫前缀树,用来存储和查询字符串。例如,water,wish,win,tie,tired这几个单词可以用以下方式存储:我们发现整棵树有个根节点,根节点下面是第一个字母。其中每个字符占据一个节点,拥有相同前缀的字符串可以共用部分节点。起始点是特殊点(我们设为1号原创 2021-03-29 23:57:34 · 71 阅读 · 0 评论 -
KMP算法模板
KMP算法模板自己对KMP算法不是很熟,特意写了一篇KMP模拟。P3375#include <bits/stdc++.h>using namespace std;typedef long long ll;#define FR freopen("in.txt", "r", stdin)#define FW freopen("out.txt", "w", stdout)struct KMP{ int next[1000005]; string pattern;原创 2021-03-29 23:10:10 · 74 阅读 · 0 评论 -
字符串——字符串匹配
文章目录字符串匹配导论一、基本概念字符串匹配问题符号和术语后缀重叠引理二、朴素字符串匹配算法三、Rabin-Karp算法字符串匹配导论一、基本概念字符串匹配问题假设文本是一个长度为nnn的数组T[1…n]T[1 \ldots n]T[1…n],而模式是一个长度为mmm的数组P[1…m]P[1 \ldots m]P[1…m],其中m≤nm \leq nm≤n,进一步假设PPP和TTT的元素都是来自一个有限的字母集∑\sum∑的字符。数组TTT和PPP通常被称为字符串。如果0≤s≤n−m0 \leq原创 2021-03-06 14:56:14 · 1531 阅读 · 0 评论