随笔分类 - 字符串-后缀自动机SAM
摘要:题目 "P4081 [USACO17DEC]Standing Out from the Herd" 做法 一眼合并$endpos$裸题 其实是不需要合并的,因为保证只在一个串出现,建个$parent$树统计一下就好了 My complete code cpp include include incl
阅读全文
摘要:题目 "P4070 [SDOI2016]生成魔咒" 有点水 做法 每次把加上$np$这个点新生产的串,直接加上$np.longest np.fail.longest$ My complete code cpp include include include include include inclu
阅读全文
摘要:题目 "P1368 工艺" 你好水题 做法 备份一下原数组,然后插入,直接输出贪心每位最小的就好了 My complete code 再见水题
阅读全文
摘要:题目 "P4022 [CTSC2012]熟悉的文章" 题目大意:多个文本串,多个匹配串,我们求$L$,$L$指(匹配串中$≥L$长度的子串出现在文本串才为"熟悉",使得匹配串整个近似"熟悉")的最大值 近似"熟悉":将匹配串分割,所有串总"熟悉"长度有$90\%$以上 做法 首先明确一点,$L_1
阅读全文
摘要:题目 "CF235C Cyclical Quest" 化简题意:多个环型匹配串在文本串出现次数 做法 我们把环型串备份展开在文本串匹配 当$parent.len≥len$时我们要跳父亲,因为要找$endpos$ 当$now.len≥len$时我们就可以统计答案了,为保证时间复杂度,我们不会把环型匹配
阅读全文
摘要:题目 "P3346 [ZJOI2015]诸神眷顾的幻想乡" 实际上,广义后缀自动机真的不需要特判重复节点,每次移到根重新建就好了 反正有相同的也只会当作$parent$且长度相等并不影响$parent$树上的操作,下次节点不重复后又会跳$fail$来维护原本的状态 做法 有个隐藏条件,树上每个节点的
阅读全文
摘要:每个点代表的都是字符串里的一个子串 可以理解为对于字符串每个字串建的$trie$图 $fail/link$指向$parent$这个状态的最长后缀状态 $\therefore parent.longest+1=now.shorest$ $endpos$:一个子串出现在原串的位置(末端点)集合 $end
阅读全文
摘要:"P3181 [HAOI2016]找相同字符" 对一个串建SAM,另一个串在这上面跑,到达一点时,假设经过了$cnt$个点 计算这个串所有后缀产生的贡献就好了,直接暴力跑上去可能会超时,topsort预处理一下 cpp include include include include include
阅读全文
摘要:"【SPOJ】Longest Common Substring II" 多个字符串求最长公共子串 还是将一个子串建SAM,其他字符串全部跑一边,记录每个点的最大贡献 由于是所有串,要对每个点每个字符串跑完后去最小值才是每个点的最终贡献 cpp include include include incl
阅读全文
摘要:"【HDU4622】Reincarnation" 一眼似乎不可做,但发现$strlen(x)$很小,暴力$O(n^2)$预处理每个区间$(l,r)$,查询时$O(1)$输出就好了 cpp include include include include include typedef int LL;
阅读全文
摘要:"P5112 FZOUTSY" 建个后缀自动机,当然这里得反着建 找到最小的大于k的子串,相当于最小满足的子串,$endpos$最大,然后沿$parents$边都染成同一色 同色的都满足后缀的最长公共前缀满足大于k,接下来就是莫队在树上跑 cpp include using namespace st
阅读全文
摘要:"【SPOJ】Distinct Substrings" 求不同子串数量 统计每个点有效的字符串数量(第一次出现的) $\sum\limits_{now=1}^{nod}now.longest parents.longest$ My complete code cpp include using na
阅读全文
摘要:P4248 [AHOI2013]差异 题目大意 长度为 $n$的字符串$S$,令$T_i$表示它从第$i$个字符开始的后缀,求$\sum\limits_{1\leqslant i<j\leqslant n}^{} len(T_i)+len(T_j)+2×lcp(T_i+T_j)$ 其中,$lcp(a
阅读全文