随笔分类 - 算法-字符串
摘要:lcp 就是后缀树上的 lca。因为字符串随机,所以后缀树树高是 O(log n) 级别的。将询问离线,从小到大枚举 R,暴力跳祖先,更新一些 i 的答案。需要数据结构支持:前缀对一个值取 max,区间求和。发现要取 max 的值是 O(log n) 级别的,对每个值记录最大位置,就可以实现 O(1) 修改,O(log n) 查询。总时间复杂度 O(n log n)。
阅读全文
摘要:对每个i,预处理以i结尾的AA数量f[i],以i开头的BB数量g[i],答案就是Σf[i]*g[i+1]。朴素地求f,g,时间复杂度是O(n^2)的。考虑枚举A的长度len,把是len倍数的位置标位关键点,则每个AA必定跨过恰好2个关键点。枚举每一组关键点,可以O(1)统计出跨过它们的AA。关键点数量是调和级数。所以总复杂度O(n log n)。
阅读全文
摘要:因为border的border还是border,所以一个串的最小border,也必须是无界单词。设dp[i]表示长度为i的无界单词数量,转移时,枚举最小border的长度(长度一定不超过floor(i/2))j,dp[i]可以从dp[j]转移过来。对第二问,可以逐位确定,每次对后面还未确定的位,做类似的DP。
阅读全文
摘要:考虑预处理出s的每个子串是不是t的子串。发现对于一个左端点i,是t子串的右端点是从i开始的一段连续的区间,我们记这样的最大右端点为R[i]。对t建SAM,可以通过在SAM上跳求出R[1...n]。然后对于询问l,r。分r<=R[i]和r>R[i]两类讨论。那么相当于一个二维的区间最大值查询。通过离线去掉一维,另一维用线段树维护即可。
阅读全文
摘要:后缀数组,即SA,是一种简单实用的字符串算法。当我们要处理一些关于子串的问题时,我们发现字符串中任意的一个子串都可以表示成该字符串一个后缀的前缀,因此我们只需要维护所有后缀的信息即可。基于这个思想,人们发明了后缀数组。 把所有的后缀按字典序排序 这是后缀数组算法的第一个任务。 我们定义: \(\te
阅读全文