
后缀自动机
LZJ209
主页:https://zongjia.li/
展开
-
BZOJ2946: [Poi2000]公共串
第一次写后缀自动机,好激动,参照了Po姐的写法,这道题我们只需将第一个串建立后缀自动机,然后其他的串在上面跑就可以了,找到一个最长的n个串都经过的子串就可以了(后缀自动机真快啊)#include<cstdio>#include<cstdlib>#include<cmath>#include<ctime>#include<cstring>#include<string>#include<i原创 2016-12-30 18:11:37 · 390 阅读 · 0 评论 -
BZOJ 4566: [Haoi2016]找相同字符 后缀自动机
Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数。两个方案不同当且仅当这两 个子串中有一个位置不同。Input两行,两个字符串s1,s2,长度分别为n1,n2。1 <=n1, n2<= 200000,字符串中只有小写字母Output输出一个整数表示答案Sample Input aabb bbaa Sample Output 10题解:原创 2017-05-25 20:02:55 · 510 阅读 · 0 评论 -
bzoj 3879: SvT 后缀自动机+后缀树+虚树
题目大意:给定一个字符串,多次询问一些后缀两两之间的最长前缀和。 题解:首先可以很简单的看出是后缀树,然后就很自然地想到用后缀自动机来构建后缀树,然后就变成了一道裸的虚树DP。真是说起来容易啊,写的时候要注意一些问题,代表后缀的节点为第一次插入的节点,中间建的nq起到辅助节点的作用,然后,,,好像也没啥了,写了就知道了QAQ#include<cstdio>#include<cstdlib>#i原创 2017-04-12 22:00:27 · 572 阅读 · 0 评论 -
BZOJ 4545: DQS的trie
一道后缀自动机的好题,综合了后缀自动机一些重要的操作。 对于询问一,我们边建树边维护。 对于询问三,我们用一个LCT来维护。 (记得开long longQAQ)#include<cstdio>#include<cstdlib>#include<cmath>#include<ctime>#include<cstring>#include<string>#include<iostrea原创 2016-12-30 19:50:17 · 516 阅读 · 0 评论 -
BZOJ 4327: JSOI2012 玄武密码
后缀自动机裸题。 借着这道裸题总结一下后缀自动机的查询问题。 1.查前缀 查询时不跳parent,遇到空节点就跳出。 2.查子串 查询时跳parent,记录最大ans. 3.查次数 LCT维护right数组 4.查不同的串的数目 在建树时维护,一个点对答案的贡献为this->max_len - this->parent->max_len#include<cstdio>#include<c原创 2016-12-30 19:46:31 · 692 阅读 · 0 评论 -
BZOJ 4698: Sdoi2008 Sandy的卡片
这道题看到加几个数就能变成另一个数就知道是差分啦,然后显而易见的就是最后的答案为所有串的最长公共串+1,那我们之后怎么办呢,我们先对所有串建一个广义后缀自动机,然后在自动机上搜寻每一个单词,对单词的每一个节点一直跳parent指针,路径上每一个点的次数加一,统计出所有访问次数为字符串总数的长度最大值就好啦,为了不重复访问,我们将每一个点弄一个标记,为了防止繁琐的清空操作,弄一个时间戳就好啦。我这个傻原创 2016-12-30 19:39:24 · 16656 阅读 · 0 评论 -
BZOJ 4516: [Sdoi2016]生成魔咒
后缀自动机的基础应用:计算不同的子串个数。我们只需要将每个点的max_len-min_len+1的和维护一下就行了,这里要引进一个结论,就是一个节点的min_len==其parent节点的max_len+1,具体怎么证我就不说了,总之代入之后就将公式变为了this->max_len - this->parent->max_len,这样就可以在建后缀自动机的时候顺道维护出来答案了。#include原创 2016-12-30 18:18:08 · 377 阅读 · 0 评论 -
BZOJ 2555: SubString 后缀自动机+LCT
后缀自动机的经典模型,查询一个字符串出现了几次,我们可以联想一下在代码中并未体现的right数组,我们很容易发现,有几个right数组就代表着这个单词出现了几次,那么我们只要设法维护出来就好了,我们可以想到加一个单词在parent树中只对这个单词所在的链有影响,所以我们只要维护一个LCT把parent树维护出来就行了,每次新加节点将parent树对应的链的right+1就行了(据说这题不用LCT更快原创 2016-12-30 18:33:18 · 418 阅读 · 0 评论 -
BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
这道题首先要读明白题,就是说叶子节点不超过20个,那么我们就可以以每一个叶子节点为根建一个广义后缀自动机,这样就一定能表示出来所有的子串,然后统计一下答案就可以啦。 (广义后缀自动机就是把好多串放到一块,每次都从root开始建后缀自动机,但由于这道题是一棵树,所以我们只需先把节点开出来,在dfs的过程中在dfs的出发点之后新插入一个字符)#include<cstdio>#include<cstd原创 2016-12-30 18:25:10 · 413 阅读 · 0 评论 -
BZOJ 2806: [Ctsc2012]Cheat 后缀自动机+单调队列优化DP
题意:算了不想写题意了233 题解:对所有串建一个广义后缀自动机,然后对于每个模板串算出到第i位最大能匹配多远,二分出一个答案,然后写出一个DP方程,F[i]表示到第i位最多能匹配多少位,f[i]=max(f[j] (i-maxx[i]<=j<=i-midans) +i-j) 显然单调队列乱搞一下就行了。#include<iostream>#include<iomanip>#include<c原创 2017-05-25 20:28:45 · 454 阅读 · 0 评论