
后缀自动机
Lynstery
一只蒟蒻
展开
-
SAM 后缀自动机——学习笔记
什么是后缀自动机(SAM)?大概可以理解成对暴力在字母树中插入n个后缀的一种优化。 首先它是一个自动机。 对于一个字符串 sss , SAMSAMSAM 能识别其所有的后缀。还有一系列扩展运用。一些分析和证明用 ST(st)ST(st)ST(st) 表示在自动机中从初始状态沿着字符串st走到达的状态。 字符串 ST(a)ST(a)ST(a) 能识别xxx , 当且仅当 axa...原创 2017-07-25 11:08:52 · 686 阅读 · 0 评论 -
[SAM] POJ1509 Glass Beads
题意给定n,求最小循环子串的开头位置。 若有多个答案,输出开头位置最小的。 n<=10000题解SAMSAM 最水的模板题。 把串复制一段接在后面,然后在SAM上走,每次选标号最小的边走,走n步就达到了答案状态。 我们还需要输出位置。就相当于求子串在原串中首次出现位置,这个问题我们可以对每个状态维护 RightRight 集合的最小元素来解决。#include<cstdio>#includ原创 2017-07-26 16:12:41 · 446 阅读 · 0 评论 -
[SAM] hihoCoder1445 后缀自动机二·重复旋律5
题意给出一个只含小写字母的串 ss ,求 ss 的不同的子串总数。 |s|≤1000000|s| \le 1000000题解SAMSAM 最水的模板题。 直接建出 SAMSAM ,把所有状态的 max(A)−min(A)+1max(A)-min(A)+1 全部加起来即是答案。应该不需要解释。 实现的话可以在 ExtendExtend 过程中维护,这样写比较有价值。 #include<cstd原创 2017-07-26 23:05:27 · 847 阅读 · 0 评论 -
[SAM] Spoj1811 LCS - Longest Common Substring
题意求两个串 s1s1 , s2s2 的最长公共子串。 |s1|,|s2|≤250000|s1|,|s2| \le 250000题解SAMSAM 模板题。 先建出 s1s1 的 SAMSAM ,然后把 s2s2 放上去跑。 考虑当且处理到第 ii 位,若 pp 出发有标号为 s2[i]s2[i] 的边,就直接走,该阶段答案为上次加 11 . 若没有标号为 s2[i]s2[i] 的边,就走 p原创 2017-07-27 23:48:24 · 464 阅读 · 0 评论