摘要:
BZOJ 1396 识别子串 昨晚拿到这道题想到了线段树做法还以为麻烦了,码了好久过了才发现网上都这么写的。。 只出现一次实际上就是 endpos 集合大小为1,就是 parent 树上siz是1。 由于我们只需要 endpos 集合大小是1的点的 endpos 集合,也没必要线段树合并求 endp 阅读全文
摘要:
BZOJ 4556 [HEOI2016/TJOI2016]字符串 其实题解更多是用后缀数组+数据结构的做法,貌似也不好写。 反正才学了 sam 貌似比较简单的做法。 还是得先二分,然后倍增跳到 $ s[c...c+mid 1] $ 所在的节点,然后看看有没有 endpos 在 $ a+mid 1.. 阅读全文
摘要:
后缀自动机 初学建议看 "这个" 基本上是最好的中文资料了。 字符串的SAM是一个dAg,它的边上会有一个字符,从根节点走到终止节点会构成一个后缀。它可以且只可以接受 $ s $ 的所有后缀,并且满足可以接受 $ s $ 的后缀的自动机中,SAM是节点最少的。 由于后缀自动机是个dAg,它的每个节点 阅读全文
摘要:
后缀数组 后缀数组,也就是后缀排序,是一个给字符串所有后缀排序的算法。 构造 直接排序我们比较的是前 $ n $ 个字符的大小关系。为了优化这个过程,后缀数组用了一种倍增的思路。比较每个字符串的第一位,再比较前 2 位,再比较前 4 位... 最后得到整个数组。这样可以合理利用已经处理的结果。在比较 阅读全文
摘要:
hdu 5421 Victor and String 支持双端插入的回文树。 考虑维护第二个 last 表示当前整个串的最长回文前缀。 往前 append 的时候可以直接那第二个 last 来跳 fail , 因为回文前缀和回文后缀是对称的。只有 getfail 的时候需要改一下,变成判断当前字符和 阅读全文
摘要:
回文树 回文树,也就是回文自动机,PAM(Palindrome automaton) 是一个处理回文串的有力工具。然而这个东西比SAM简单多了。。 (它可能比 manacher 要强得多?) 回文自动机有两个根,也就是说其实是有两个树的,一个存储长度为奇数的回文串一个存储长度为偶数的回文串。 回文自 阅读全文
摘要:
魔法咒语 没有一个点到极限数据海星。。。虽然极限数据好像没法做? 前 60% 很套路的 acam dp。$ dp[i][j] $ 表示当前匹配到第 $ i $ 个位置,当前在 ACAM 上 $ j $ 号节点。 后 40% 的数据看起来很矩乘。(其实整个数据范围都挺矩乘的) 由于 $ dp[i][j 阅读全文
摘要:
阿狸的打字机 首先建立fail树,考虑离线询问。考虑怎么用ACAM处理一个串在另一个串的出现次数, 可以给询问按照主串分类,对于每一个主串分别处理所有询问。某一个串在主串中出现,主串中位于这个串最后的那个位置跳fail必然可以跳到这个串。所以可以树上差分搞一下 大概没啥问题? 然后写了一发,就70了 阅读全文
摘要:
AC 自动机 做多模匹配其实就是把模式串丢到trie上,然后设置一个fail指针。 fail指针的含义是:最长的与后缀相同的前缀 明显,由于是最长的一个点的fail只会只想一个点(两个相同的前缀是一个点啊) 一个结论:如果沿着一个点一直跳fail,会得到这个串在ac自动机上的所有后缀 求出fail的 阅读全文
摘要:
斯坦纳树 $ dp[i][S] $ 表示 当前根为 $ i $ 当前生成树已经覆盖掉得关键点集合是 $ S $ 得最小代价。 转移分两种: 合并同一个根下的两种状态, $ dp[i][S_1\|S_2] = \min( dp[i][S_1]+dp[i][S_2] w[i] ), S_1 \& S_2 阅读全文