自动机
yzyyylx
这个作者很懒,什么都没留下…
展开
-
BZOJ4502 串
Description兔子们在玩字符串的游戏。首先,它们拿出了一个字符串集合S,然后它们定义一个字 符串为“好”的,当且仅当它可以被分成非空的两段,其中每一段都是字符串集合S中某个字符串的前缀。 比如对于字符串集合{“abc”,”bca”},字符串”abb”,”abab”是“好”的(”abb”=”ab”+”b”,abab=”ab”+”ab”),而字符串“bc”不是“好”的。 兔子们想知道,一共原创 2018-03-15 18:43:23 · 531 阅读 · 0 评论 -
codeforces506E Mr. Kitayuta's Gift
题面题意给你一个长度为n的字符串,现要你加上m个字符,使其变为一个回文串,问有几种加法。做法首先题目可以转化为,求有几个长度为n+m的字符串,使给出的字符串为该字符串的子序列。这样可以考虑从两边开始确定字符,并与给出的字符串进行匹配,然后我们就可以根据此时的字符串已经匹配的位置建立自动机,这个自动机由多个节点构成,每个点都有一个权值为24,25或26(仅终点是26)的自环,然后非自环会形...原创 2019-03-03 13:44:01 · 391 阅读 · 0 评论 -
2018-2019 ACM-ICPC, Asia East Continent Finals J. Philosophical … Balance
题面题意多组数据,每组数据给出一个长度为n的字符串S,求maxi∑j=1nlcp(i,j)∗kj\max_{i}{\sum_{j=1}^{n}lcp(i,j)*k_{j}}maxi∑j=1nlcp(i,j)∗kj的最小值其中kik_{i}ki由你定,但是要满足∑i=1nki=1\sum_{i=1}^{n}k_{i}=1∑i=1nki=1,且0<=ki&lt...原创 2019-03-05 17:58:26 · 564 阅读 · 0 评论 -
codeforces1110H Modest Substrings
题面题意给出三个数l,r,nl,r,nl,r,n,求出一个由数字组成的字符串,使其所有子串中,符合在[l,r][l,r][l,r]内的数量最多,若有多组解,输出字典序最小的一个。做法首先考虑最朴素的做法,可以将[l,r]内的所有数字当作字符串加入一个AC自动机,直接在上面dp。但是因为l和r极大,因此需要优化。发现当一个数的长度确定,并且某一个前缀也确定之后,无论其后面填什么数,它都在[...原创 2019-02-22 13:46:40 · 255 阅读 · 0 评论 -
HDU5470 Typewriter
题面题意给出一个字符串,现在你要打印它,你有两种操作: 1.在已打印字符串后面打印一个字符,代价为该字母的代价。 2.选择已打印的字符串的一个子串s,在后面复制粘贴,代价为|S|*A+2*B。做法第一个操作很好处理,难点在于第二个操作。 首先考虑dp[i]表示打印前i个字母所需要的代价,这样dp[i]=min(dp[i-1]+need[i],dp[j]+(i-j)*A...原创 2018-07-28 12:55:58 · 714 阅读 · 0 评论 -
CodeForces 86C Genetic engineering
题面题意给出m个字符串,要求构建一个长度为n的母串,要求每个字符都被至少一个子串覆盖,问有几种方案。做法首先肯定要建出AC自动机,因为每个字符都要被覆盖,可以在匹配时不跳fail指针,除非此时恰好在一个子串的最后一位,但是这样显然会有重复,因此要考虑转化方式。 因为子串长度较小,所以可以考虑再加一维,记录此时有几位未被匹配,然后每次判断一下是否可以匹配掉这些的失配的字符。...原创 2018-07-27 11:03:22 · 1035 阅读 · 1 评论 -
HDU 4787 GRE Words Revenge
题面题意有2种操作: 1.学习一个字符串(已学过则不算) 2.查询某个字符串中有几个学过了。 强制在线做法如果不用在线,则离线建AC自动机,轻松解决。 但是,题目要求强制在线,可以发现,随着新串的加入,AC自动机上节点的fail指针也会随之改变,因此AC自动机必须重构,但若直接重构必然会T。 因此,可以考虑分块的思想,建两个AC自动机a,b,每次将字符串加入到b中,加...原创 2018-07-25 20:17:25 · 313 阅读 · 0 评论 -
AC自动机
作用用于处理多个字符串匹配,例如给出一些关键单词,再给出一篇文章(或多篇),问文章内的出现了几个单词或一共出现了几次.实现方法可以说是KMP与字典树的结合,就好像利用字典树存储多个字符串的next数组. 首先将所有关键单词建一棵字典树,每个节点除了存储26(字符种类数)个儿子外,还要储存sum和fail. sum用于记录此节点是否是某个关键词的尾字符,并且也可以顺便储存此字符串的个数 fail原创 2018-03-13 19:37:10 · 204 阅读 · 0 评论 -
后缀自动机
作用常用于处理字符串问题,可以高效解决许多字符串问题。实现方法有点像将一个字符串的所有后缀都建在一个AC自动机上,但不同的是后缀自动机的节点数最多为2*n,因为它只记录需要记录的点,一些没有记录东西的点可以视为与下面有价值的节点并在一起,这样大大降低了时间复杂度和空间复杂度。 对于每一个节点记录它的后面加上每个字符后后缀最长可以到达的节点,以及它的长度len,它去掉一个最短前缀后存在的节点pre。原创 2018-03-14 23:47:47 · 340 阅读 · 0 评论 -
Palindromic Tree 回文自动机-回文树
作用回文自动机,顾名思义,用于解决回文串的问题,可以用于处理回文串的数量,种类数等问题.构造方法与其他自动机差不多,一般记录son[字符个数] (在左右两边加入某字符后匹配的节点),len(长度),fail(失配后所到达的节点,也就是这个回文串的最长回文后缀). 一开始有两个节点,长度分别为0(偶数长度的回文字符串的起始点)和-1(奇数长度的回文字符串的起始点,定为-1可方便后面的计算) 新加入原创 2018-03-29 19:42:04 · 310 阅读 · 0 评论 -
bzoj 2434: [Noi2011]阿狸的打字机
题面题意给出一个字符串,表示一系列操作,对于被操作串(初始为空串)一共有一下三种操作: 1.给出a~z中的一个字符,表示在后面加上这个字符 2.B,删去一个字符 3.P,记录下此时的操作串 最后多次询问i串在j串中出现了几次做法根据数据范围,如果暴力模拟,记录下每次操作后的字符串,空间立刻就炸了,所以肯定要用字典树来存. 还可以发现如果对每次询问都暴力匹配或是在AC自动机上直接匹配,绝对会原创 2018-04-06 12:01:19 · 202 阅读 · 0 评论 -
bzoj 2565: 最长双回文串
题面题意给出一个回文串,求相邻两个回文串的最长长度之和.做法像这样涉及两个回文串的关系的题目,都可以考虑正着和反着分别加入回文自动机,预处理出以每个点为左右端点的最长回文串的长度,最后再枚举断点统计答案即可.代码#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#define N 500100usin原创 2018-04-05 15:52:31 · 660 阅读 · 1 评论 -
poj 2778 DNA Sequence
题面题意给出至多10个由A,G,T,C组成的字符串,问长度为n(n<=2e9),由A,G,T,C组成的且不包含之前给的几个字符串的字符串有几个.做法因为是多个字符串的匹配问题,首先建出AC自动机,若n比较小则可以在自动机上dp,但因为n很大,而且给出的字符串又短又少,故可以用矩阵快速幂. 首先找出自动机上的所有合法节点(不包含给出字符串的节点),然后统计出它们后面加一个字符能够到达的节点及个数,保原创 2018-04-01 17:54:46 · 268 阅读 · 0 评论 -
SPOJ - LCS2 - Longest Common Substring II
题面题意给出最多十个字符串,求它们的最长公共子串.做法大致思路是对第一个字符串建出后缀自动机后,每个字符串都去匹配,对于自动机上每一个节点都用一个临时数组求出它所能匹配到的最长后缀长度,每个字符串匹配完后临时数组与上一次匹配后的结束状态取一个最小值. 一开始TLE了一次,WA了一次. TLE那次我更新临时数组上的某个点时,沿着它的fail向上更新了所有点,这样对于极限数据将会退化成O(n^2),原创 2018-03-31 19:06:25 · 235 阅读 · 0 评论 -
Tsinsen A1393. Palisection
题面题意给出一个字符串,求其中相交的回文串的对数.做法可以反过来考虑,求出不相交的所有回文串对数,最后再用总数减去. 首先可以建一个回文自动机,求出再i点左边有几个回文串,然后再将字符串倒过来建一个回文自动机,求出以每个点为左端点的回文串的个数,将上下两个量分别相乘即可求出不相交的回文串的个数.代码#include<iostream>#include<cstdio>#include<cstri原创 2018-03-30 15:53:07 · 272 阅读 · 0 评论 -
洛谷 P4595 [COCI2011-2012#5] POPLOCAVANJE
题面题意给出一个字符串S(长度不超过300000)和至多5000个串,用这至多5000个串去覆盖S,每个串允许用多次,且允许串重叠,则S中至少有几个字符不被覆盖。空间限制为64MB做法这题可以用后缀自动机和AC自动机都可以直接做,但是因为空间限制,都不能直接建。但是注意到这5000个字符串相互独立,所以可以进行分块,对约根号个串建出AC自动机后,计算贡献,然后每次再清空重建即可代码...原创 2019-03-13 21:52:57 · 216 阅读 · 0 评论