
字符串
_tan45
这个作者很懒,什么都没留下…
展开
-
【填坑】KMP
KMP用于求b串在a串的出现位置(字符串匹配)。我们通过一道题来讲讲KMP的算法过程。 【HDU 1711】给定两个数字串a、b。求b在a第一次出现的位置。若没出现输出-1。 一般的暴力算法就是暴力匹配。若有一个位置匹配失败,则回溯后重新匹配。时间复杂度高达O(nm)O(nm)O(nm)。 可以发现,这个过程中有大量的冗余运算。比方说,匹配失败后(蓝色点),图中的红色段都是已经匹配好的了。 那么...原创 2019-01-05 12:19:29 · 198 阅读 · 0 评论 -
字符串的最小/大表示法
想象一下,把一个字符串围成一个圈,再次字符圈的任意一处断开,将会得到一个新的字符串。在按此法生成的字符串中,字典序最小的称为原字符串的最小表示法,最大的称为原字符串的最大表示法。 那么,我们怎么求一个字符串的最小/大表示法呢? 思路一、 直接把这n个字符串构造出来,然后排序。 时间复杂度O(nlogn)O(nlogn)O(nlogn),空间复杂度O(n2)O(n^2)O(n2),TLE 思路二、 ...原创 2019-01-13 21:53:45 · 255 阅读 · 0 评论 -
AC自动机
问题引入 给定m个关键字和一个文本,求其中有多少个关键字在文本中出现过。 分析 这是一个字符串匹配问题。我们当然可以用(扩展)KMP解决。但是,如果数据规模稍微大一些,这个算法的表现依旧不好。 所以,我们介绍一个新东西——AC自动机。它专门用于解决这种多关键字匹配的问题。 首先,我们将这些关键字做成一个trie树。(画得好丑啊) 定义fail[i]为**如果在i节点处匹配成功,而在匹配下一个字符...原创 2019-01-19 11:51:59 · 195 阅读 · 0 评论 -
AC自动机上的dp
有些时候,我们会碰到这样的一类问题:给定n个字符串,求长度为m的(不)包含这n个字符串的字符串个数。即字符串匹配的计数问题。 我们先来看这样一道题: 【poj 2778】给出m个疾病基因片段(m<=10),每个片段不超过10个字符。求长度为n的不包含任何一个疾病基因片段的DNA序列共有多少种?(n<=2000000000) 【分析】 我们先考虑一下朴素的dp:设dp(i,j)dp(i,...原创 2019-01-19 12:42:58 · 1021 阅读 · 0 评论 -
【bzoj4974】字符串大师
【题意】 给定某个字符串的pre值,pre[i]表示原串长度为i的前缀的最小循环节长度,求一个符合条件的字典序最小的字符串。 P.S.最小循环节T:满足若干个T拼接在一起,使S为拼接后所得串的前缀的最短字符串。 【题解】 前置知识:最小循环节长度len[i]=i-nxt[i](nxt[i]即为kmp中的next数组) 我们先回想一下kmp的过程。构造next数组时,我们是这样更新它的:(字符串从0...原创 2019-01-16 22:55:55 · 473 阅读 · 0 评论 -
【BZOJ 4892】DNA
又一个DNA 【题意】 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个碱基,依然能够表现出吃藕的性状。现在研究人员想知道这个基因在DNA链S0上的位置。所以你需要统计在一个表现出吃藕性状的人的DNA序列S0上,有多少个连续子 串可能是该基因,即有多少个S0的连续子串修改小于等于三个字母...原创 2019-10-07 21:51:56 · 272 阅读 · 0 评论