ACM字符串
罗博士
这个作者很懒,什么都没留下…
展开
-
AC自动机
在字典树上加上失配链(也可以叫做失败指针)就可以构成AC自动机,可以用来解决多模式匹配的问题。给定多个模式串P0、P1、……,给定目标串T,问T中包含了哪些P……等等问题。 在AC自动机中,每一个节点都有一个失败指针指向自动机中的另外一个节点;除了根节点,根节点的失败指针指向NULL。假设节点A的失败指针指向节点B,说明节点A的向上的字符串与从根到B的字符串匹配,而且匹配长度是最长的。 如下的A原创 2015-03-31 13:19:17 · 809 阅读 · 0 评论 -
自动机初步之DFA
自动机是一种非常有力的工具,其完备的理论可以参考编译原理或者形式语言与自动机等相关教材。从某种定义角度而言,图灵机也是自动机的一种。这里提到的自动机特指有限状态自动机,简称为FA,根据状态转移的性质又分为确定的自动机(DFA)和非确定的自动机(NFA)。FA的表达能力等价于正规表达式或者正规文法。FA可以看做是一个有向带权图,图的顶点集合称为自动机的状态集合,图的权值集合为自动机的字母集合,图的边代原创 2016-08-02 16:12:36 · 5314 阅读 · 0 评论 -
后缀数组
给定一个长度为N的字符串S,令Si为从第i个位置开始的S的后缀,i称为后缀Si的序号,i取值范围从0到N-1。显然S有N个后缀。将这N个后缀按字典序升序排列,并用一个数组记录其后缀序号,则该数组称为后缀数组。令S=adbc,则S共有4个后缀,分别为 S0=adbc S1=dbc S2=bc S3=c 其字典序升序是S0、S2、S3、S1,所以字符串S的后缀数组是 SA[] = {0, 2原创 2015-04-10 23:20:31 · 1095 阅读 · 0 评论 -
POJ1743——不可重迭的最长重复子串
题意:给定一系列的整数作为音阶,旋律为相邻音阶之差。问最长的主旋律是多长,主旋律需满足3个条件: 1. 长度至少为5; 2. 至少重复出现2次; 3. 主旋律各不重迭。对源进行变换以后,就是问不重迭的最长重复子串是多长。求出SA数组与Height数组以后。 首先将问题改为判定性问题,即给定长度L,问是否存在L长度的不重迭重复子串。其等价于在Height数组中找到一个区间[i,j],He原创 2015-04-11 22:32:41 · 483 阅读 · 0 评论 -
POJ3261——重复K次的子串
题意:给定长度为N的整数串,问至少重复K次的子串最长是多少,重复子串之间可以重迭。求出SA与Height数组,首先将问题转为判定性问题,即:给定长度L,问存不存在长度为L且重复K次的子串。然后二分搜索最大的可能的L即可。存在长度为L且重复K次的子串等价于:Height数组中存在一个长度至少为K-1的区间[i,j],Height[i,j]的值全部都不小于L。另外源数组中的元素取值范围在百万之间,使用基原创 2015-04-11 22:35:22 · 920 阅读 · 0 评论 -
SPOJ694 && SPOJ705 ——不同子串的总数
题意:给定字符串S,求S的不同子串的总数量。求出SA数组与Height数组,每个子串必然是某个后缀的前缀。令S的长度为N,则后缀SA[i]可以贡献出N-SA[i]个前缀。但其中有Height[i]个与之前的是重复的,因此要减去。另外,在套模板的时候,处理的字符串S实际上比源字符串多一个结束标记,因此计算出的不同子串数量比答案要多N(N为S的长度,非源的长度,实际上就是源长度加1)。SPOJ694//原创 2015-04-11 22:53:37 · 1237 阅读 · 0 评论 -
后缀自动机的程序实现
一个字符串T的后缀自动机SAM(T)是指这样一个确定的有穷自动机,该自动机接受且仅接受T的所有后缀,包括ε;而且该自动机是最小状态的。 给定任意字符串T,求其SAM有2个关键。其一,SAM(T)并不是直接生成的,而是需要依次求出其所有前缀的SAM。换一种说法,如果要求SAM(Tx),其中T是一个字符串,x是一个字母,那么必须首先求出SAM(T),然后在其基础上通过添加新的节点和边才能求出原创 2014-04-20 23:40:58 · 1014 阅读 · 0 评论 -
后缀自动机实现的例子
后缀自动机的实现流程可以参考。原创 2014-04-21 11:14:12 · 774 阅读 · 0 评论 -
字典树
字典树又称为Trie Tree。Trie来自于单词retrieval。字典树是一种存储、统计和查找大量字符串的数据结构。如下图显示了一个字典树,其中保存了5个单词:how、howl、what、where和when。 字典树显然是一个树型结构,可以认为除根节点外每个节点对应一个字母,也可以认为每条边对应一个字母。实际上,边和节点都不显示的保存字母,而是以子节点的排序表示字母。假设字典树的字母表就是2原创 2015-03-31 06:52:15 · 752 阅读 · 0 评论 -
字符串的最小表示
长度为n的字符串s,其字母序列表示为[0,1,2,…,n-1]。将其循环左移一位变为[1,2,…,n-1,0],记作s(1)。则s(k+1)为s(k)循环左移一位得到。s(0)就是s。一共可以得到n个字符串的集合,{s(0),s(1),…,s(n-1)},称为s的循环同构集合,n个字符串中字典序最小的那个称为集合的最小表示,也称为s的最小表示。如果字符串a、b属于同一个循环同构集合,则说二者是循环同原创 2015-03-31 17:39:47 · 1691 阅读 · 0 评论 -
字符串的特征向量与KMP算法
字符串的特征向量就是由字符串各位置上的特征数构成的一个向量。设字符串为P,令Pi为从字符串首字母到第i个位置的前缀,则字符串P的i位置上的特征数就是Pi的首尾非空真子串匹配的最大长度。例如:字符串abcdaabcab的特征向量是(0,0,0,0,1,1,2,3,1,2)。其中第5个位置的特征数是1,因为P5是abcdaa,首尾非空真子串能够匹配的就是a;而第7个位置的特征数是3,因为P7是abcda原创 2015-03-30 16:33:16 · 8752 阅读 · 5 评论 -
自动机初步之NFA及ACM中常见的自动机
NFA也是自动机的一种,与DFA对应。对于DFA来说,在指定状态,经过指定字母,会到达唯一确定的状态。对于NFA而言,在指定状态经过指定字母,到达的是一个状态的集合。换种说法,经过某个字母到达的状态不是唯一确定的,候选集合中的状态都存在可能。特别的,NFA存在ϵ{\epsilon}边,即不需任何字母即可从一个状态去往另一个状态。考虑仅由字母{a,b}\{a,b\}构成的字符串。要求字母bb必须连续出原创 2016-08-02 22:09:24 · 3230 阅读 · 3 评论