摘要:
fail树的应用。 在fail树上找到所有长度子串的信息的话,用差分最后累加是个不错的选择。 这道题主要注意负数的处理。 阅读全文
摘要:
这题写得我真想吐... 主要注意一个地方。 1.每次cut的时候,cut的一颗子树,而不是只有q这个节点。 说到底,还是没有对fail树的形态有一个清晰地认识,不过这道题写后就好很多。 阅读全文
摘要:
这题感觉有点坑啊。 题目还是不难想的,先对一个字符串建后缀自动机,然后拿另一个字符串在上面跑。 假设当前跑到了p点,匹配长度为len。 那么当前会对答案产生贡献的串是哪些呢? 显然当前会对p及p到根的链产生贡献。这样显然可以用树形dp优化。 同时需要差分(我也不知道这是否是必须的)。 下面有upda 阅读全文
摘要:
这道题思路很好出来,但是不是很好写(自己太弱的原因)。 将那M个串连起来,建一个后缀自动机。 二分L,变成判定问题。 然后对每个询问串,在后缀自动机上跑出以i位置结尾的最长长度,设为c[i]。 在之后我们要做的是在这种条件下,求出最大覆盖长度。 之后我思路出了点问题,我以为就是用[i-c[i]+1, 阅读全文
摘要:
后缀自动机秒题。 首先观察公式,发现它最难的地方在求所有后缀的LCP之和。 首先回想一下求两个后缀的LCP怎么搞? 先翻转原串,然后在fail树上找到它们的LCA,LCA节点的step值即为它们的最长公共前缀。 延续这个思路,将问题转化成,给定一颗树,每个节点上有一个权值,现在有很多特殊点,一对特殊 阅读全文
摘要:
传送门 大致题意是给定一个字符串S,再给Q个询问,每次询问字符串Xi的循环同构在S中出现了多少次。 主要应该注意,若Xi串有循环节,那么对Xi进行匹配的时候会算重(即S中相同的子串多次被算入答案),解决方法是后缀自动机上打标记,若此节点没有被算过答案,则计算答案,否则跳过。 阅读全文
摘要:
不是很神的一道题,一般。 先差分,最后答案需要+1。 一个right集的len即为该right集的最长相同后缀,考虑到不能重复,所以处理一下该right集的最大与最小的ri,最后答案ans=max(ans,min(r[i]-l[i],len[i])) poj的g++比较恶心,卡空间,卡时间。 用c+ 阅读全文
摘要:
传送门 这题可以参考平衡树求第k大的过程,需要预处理一下从当前节点往下走能走出多少个子串。 原本准备存个图用反向的topsort,发现极为麻烦,看了别人的代码后发现,他们按step大小用了基排,省了很多麻烦。 仔细看了一下构造过程,貌似确实有这样的性质,后创建且step大的节点在fail树上处于儿子 阅读全文
摘要:
传送门 输入一个字符串,要求输出长度为x的子串在字符串中的最多的出现位置。 后缀自动机,由于后缀自动机的每一个节点s的right集大小都表示子串最长为step s的数量, (而且长度在min(s)到max(s)之间的字符串出现次数必定相同,所以每次只需要更新step s,最后从大到小顺次cmax即可 阅读全文
摘要:
SAM模板题。 主要思路是,先对一个串建SAM,然后拿其他串在上面匹配,对单个串每个状态取最大的步数,对所有的串每个状态取最小步数。 循环的同时需要对fail树按topsort序更新最大值。 为什么要从fail树更新最大值?我的理解是,单个节点上记录的Max,Min等是结束位置属于此节点right集 阅读全文