ACM_Suffix_Automation
文章平均质量分 80
Gatevin
这个作者很懒,什么都没留下…
展开
-
SPOJ SUBLEX Lexicographical Substring Search 后缀自动机
题目大意:就是现在对于给出的长度不超过90000的字符串进行Q(Q 其中相同的子串只算一次例如“aaa"的子串是"a", "aa", "aaa"大致思路:首先对于给出的字符串建立后缀自动机, 然后利用后缀自动机的性质, 所有相同的子串一定会在同一点终止, 那么, 从根开始, 每次都选择尽量小的字符走, 首先我们可以dfs预处理出每个状态点处代表的可能向下的不同字串有多少个,原创 2015-04-10 15:49:00 · 1045 阅读 · 0 评论 -
ACdream 1430 SETI 后缀自动机
题目大意:就是对于给定的串S, 长度不超过10000, 求出其有多少种子串T, 使得T在S中至少不重叠地出现了2次以上大致思路:很明显的后缀自动机吧, 建立S的后缀自动机, 记录每个节点对应的串出现的最左和最右位置, 以及出现次数, dfs遍历一遍后缀自动机上的点即可了细节见代码吧代码如下:Result : Accepted Memory :原创 2015-05-20 21:02:56 · 835 阅读 · 0 评论 -
HDU 3518 Boring counting 后缀自动机
题目大意:就是对于给出的字符串S, 长度不超过1000, 求其中本质不同的子串的数量, 这些子串满足在字符串S中出现了至少不重合的2次大致思路:如果将S建立后缀自动机的话, 记录每个节点处的串最早一次和最后一次出现的位置, 然后状态 t 处的字符串长度为[Min(t), Max(t)]比较其和rightmost - leftmost 的大小即可知道这个状态下有多少满足条件的串原创 2015-05-05 09:33:57 · 830 阅读 · 0 评论 -
BZOJ 2555 SubString 后缀自动机
题目大意:如题面所述, 在线状态下接受添加字符和查询某个字符串出现的次数加上了一些加密的条件使得被迫在线查询大致思路:就是后缀自动机的裸题吧=_=没什么特别的, 直接贴代码好了, 不懂的看代码细节吧代码如下:Result : Accepted Memory : 140140 KB Time : 6044 ms/* * A原创 2015-05-05 18:35:06 · 628 阅读 · 0 评论 -
HDU 4270 Dynamic Lover 后缀自动机
题目大意:就是现在初始有一个字符串, 然后接下来有m (m 大致思路:首先用后缀自动机的话对于添加操作和询问操作都很容易解决, 但是对于删除操作就不太好办了对于删除操作需要对于SAM中的每个节点都添加一个del指针, 表示是否已经被删除, 然后由于每次添加新字符的时候最多只会添加2个节点, 将有同一次插入字符新生成的结点的del指针指向同一个bool的域, 那么删除操作的时原创 2015-04-27 15:05:28 · 1276 阅读 · 0 评论 -
BZOJ 2806 (ctsc 2012) Cheat 后缀自动机预处理 + DP
题目大意:就是现在有m个01串代表搜集的文章, 现在要检查n篇作文, 对于每一篇作文找到最大的L值, 一篇文章的L值可以将这篇文章分割成多个部分, 其中长度>=L的且在m个01串中出现过的串称之为熟悉的串, 熟悉的串的长度加起来要达到文章总长度的90%就称这篇文章熟悉, 求最大的L使得这篇文章熟悉大致思路:首先将m篇文章连起来中间用另外的字符隔开, 然后将要检查的作文在这个自动原创 2015-04-28 09:38:54 · 840 阅读 · 0 评论 -
HDU 4622 Reincarnation 后缀数组 或 后缀自动机
题目大意:就是现在给定字符串S (长度不超过2000), 接下来是Q次询问(Q 大致思路:首先如果用后缀数组的话不难想到求出S的后缀数组之后, 对于每一次询问 l, r, 遍历height数组找到 l 0)这样复杂度是O(Q|S|)如果用后缀自动机来做的话我刚开始想的是对于S建立后缀自动机之后, 对于每次询问, 将子串[l, r]在S的后缀自动机上遍历一遍,原创 2015-04-16 19:58:15 · 1058 阅读 · 0 评论 -
Codeforces 427D Match & Catch 后缀自动机 或 后缀数组
题目大意:就是对于两个字符串S1和S2, 求出他们最短的一个公共字串P, 满足P在S1中只出现1次, P在S2中也只出现一次, 输出P最小的长度, 如果这样的P不存在, 输出-1大致思路:很明显的一个做法是将S1和S2连接起来中间用未出现的字符隔开, 然后建立后缀自动机, 记录每一个状态中表示的字符串的来源(可以状压记录), 然后所有状态中, 满足Right集合为2, 且状压表原创 2015-04-16 20:45:40 · 1128 阅读 · 0 评论 -
SPOJ LCS2 Longest Common Substring II 后缀自动机
题目大意:就是现在给出最多10个长度不超过10^5的字符串, 求这10个串的最长公共字串的长度大致思路:这是SPOJ LCS那题的升级版, 那道题我是将所有串连接起来中间用没有出现过的字符隔开然后整体建立后缀自动机然后对于每个点上状压记录Right集合当中元素的来源来做的但是这个题这么做会TLE, 虽然复杂度也是O(n)的, 但是这个题的时间限制很紧所以后来换了一个方法原创 2015-04-09 10:50:54 · 878 阅读 · 0 评论 -
HDU 4436 str2int 后缀数组 + 前缀和预处理 或 后缀自动机
题目大意:对于给出的n个字符串(n 例如串"101"子串有 1, 10, 101, 0, 01, 1, 对应的不同整数是1, 10, 101 (0对求和没有影响, 可以略去)大致思路:首先第一眼看得出和后缀数组有关, 但是将所有的串连接起来之后, 有一些计数上的细节需要考虑, 首先如果后缀以'0'开头则不需要加入计数(这样的后缀的所有子串对应的整数一定会在其他的后缀当中出现原创 2015-03-09 21:52:37 · 975 阅读 · 0 评论 -
SPOJ LCS Longest Common Substring 后缀自动机
题目大意:就是现在给你两个长度不超过25*10^4的串, 求他们的最长公共子串的长度大致思路:第一道后缀自动机的题...居然套模板一发过了....我的想法就是原本后缀自动机中不是对于你每一个状态State记录了Right集合的元素个数嘛, 那么对于两个输入的串, 中间用一个没有出现的字符隔开之后插入后缀自动机, 然后用一个变量appear状压记录当前这个状态所含有的Ri原创 2015-04-08 20:10:55 · 704 阅读 · 0 评论 -
HDU 4641 K-string 2013年多校第4场J题 后缀自动机
题目大意:就是现在初始的时候给出一个长度为n的串S(n K串指的是S的子串, 且在S中出现了不少于K次大致思路:首先不难想到后缀自动机, 对于初始的串S建立后缀自动机, 然后每个状态的Right集合的大小是否大于等于K就代表了这个状态代表的子串是否是K串然后由于后缀自动机的在线性质, 每次添加新的字符到S后面时, 将新的字符插入后缀自动机, 然后考虑新增加的np状态对于原创 2015-04-13 17:33:20 · 1147 阅读 · 0 评论 -
Codeforces 235C Cyclical Quest 后缀自动机
题目大意:就是现在对于一个长度不超过10^6的字符串S, 接下来有n次询问(n 轮换变化x比如 x = "aaba", 那么对应的要找出"aaba", "abaa", "baaa", "aaab"在S中出现次数的和大致思路:后缀自动机一发AC...首先对于S建立后缀自动机, 然后对于每一个询问的字符串xi, 变成xi+xi的形式, 这样对于xi + xi这个字符串在S的原创 2015-04-11 16:43:51 · 818 阅读 · 0 评论 -
SPOJ NSUBSTR Substrings 后缀自动机
题目大意:就是现在给出一个长度不超过25W的字符串S, 定义F(x)表示字符串S中长度为x的子串出现的最多次数, 例如“ababa"中F(1) = 3 (“a”出现了3次), F(2) = 2 ("ab“或者"ba"都出现了2次)F(3) = 2 ("aba"出现了2次) F(4) = F(5) = 1, 对于给出的字符串S, 长度为n, 输出F(1~n)的值大致思路:首先原创 2015-04-11 13:29:58 · 1212 阅读 · 0 评论 -
POJ 1509 Glass Beads 后缀自动机 或 后缀数组
题目大意:就是现在对于一个字符串S, 每次都可以将第一个字符放到最后面, 这样一共有lenght(S)中串, 求这样的床中字典序最小的那个的起始位置是第几个字符时最小大致思路:首先后缀数组的做法不难想到, 就是将S变成SS之后求一遍后缀数组, 扫一遍height数组, 找到第一个sa[i] = 0的那个sa[i],然后对于从这个位置开始的连续的height[i] >= leng原创 2015-04-11 14:57:04 · 1201 阅读 · 0 评论 -
HDU 5558 Alice's Classified Message (后缀自动机水题) 2015年合肥区域赛G题
好久没写题解了唔.....今天水了一题...写一下吧...题目大意:就是现在给出长度不超过10W的只包含小写字母的字符串,从下标0到 length - 1现在从下标0开始进行操作每次对于下标 i , 输出下标i开始的子串中最长的在其他地方出现过的串的长度, 其它出现的位置要求起点在位置i之前, 然后i移动到这个长度之后继续操作如果没有这样的最长的串就直接i++, 继原创 2015-11-20 17:12:58 · 2667 阅读 · 3 评论