随笔分类 -  字符串 - 后缀数组/后缀自动机

摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4650 https://www.luogu.org/problemnew/show/P1117 枚举每一段 a 的长度,然后分块,后缀数组求出每一块首关键点附近的可行范围; 然后用线段树区间加, 阅读全文
posted @ 2019-01-28 14:09 Zinn 阅读(277) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2119 思路就是对于这个形如 ABA 的串,枚举 A 的长度,并按照长度分出几块,找到一些关键点就是块的开头; 那么每一种 ABA 的串,A 的部分一定覆盖了一个关键点; 所以找关键点周围的匹配 阅读全文
posted @ 2019-01-27 10:07 Zinn 阅读(212) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4556 就是找一个 rk 在一段区间内的前驱和后继; 由于 LCP 还有区间长度的限制,所以可以先二分答案! 然后直接建立 rk 的主席树,查询即可。 代码如下: 阅读全文
posted @ 2019-01-24 22:54 Zinn 阅读(253) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4566 建出两个串的广义后缀自动机; 统计每个点在两个串中出现次数的子树和,其实就是在两个串中的 right 集合大小; 然后统计答案乘起来即可。 代码如下: 阅读全文
posted @ 2019-01-19 11:24 Zinn 阅读(289) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.php?id=3473 广义后缀自动机:https://www.cnblogs.com/HocRise 阅读全文
posted @ 2019-01-19 09:19 Zinn 阅读(213) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3998 关于相同子串算一个还是算多个,其实就是看一种状态的 right 集合是否加上 Parent 树中子树的 right 集合; 虽然是子串却不管 l 数组,因为实际上 dfs 走到一个点,得 阅读全文
posted @ 2018-12-12 17:00 Zinn 阅读(198) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 建出 n-1 个后缀自动机一起跑呗。 代码如下: 阅读全文
posted @ 2018-12-12 14:51 Zinn 阅读(136) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长。 对字符串B建一个后缀自动机,一个序列自动机,然后让A在上面找即可; 1.枚举A每个位置开始的子串,在SA 阅读全文
posted @ 2018-12-12 14:20 Zinn 阅读(196) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2555 建立后缀自动机,就可以直接加入新串了; 出现次数就是 Right 集合的大小,需要查询 Parent 树上的子树和; 所以可以用 LCT 维护 Parent 树,因为 Parent 树是 阅读全文
posted @ 2018-12-12 10:51 Zinn 阅读(137) 评论(0) 推荐(0)
摘要:题目:https://www.luogu.org/problemnew/show/P3804 模仿了一篇题解,感觉很好写啊。 代码如下: 阅读全文
posted @ 2018-12-11 22:52 Zinn 阅读(198) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2865 唯一出现的子串就是每个后缀除去和别的后缀最长的 LCP 之外的前缀; 所以用这个更新一段区间的答案,可以用线段树维护; 在 sa[i] ~ sa[i]+LCP+1 位置的答案由 LCP+ 阅读全文
posted @ 2018-12-08 16:19 Zinn 阅读(182) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 先把三个串拼在一起,KMP 求 s1 , s2 中每个位置和 s3 的匹配情况; 注意拼三个串时加入的两个新字符不要一样,否则会影响; 然后预处理出每个位置后面的第一个 s3 的开头 — 阅读全文
posted @ 2018-12-08 00:06 Zinn 阅读(165) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4310 二分答案——在本质不同的子串中二分答案! 如果二分到的子串位置是 st,考虑何时必须分出一段; 如果一个位置 i 有 rk[i] < rk[st],那么显然不用管( i 后缀的开头); 阅读全文
posted @ 2018-12-07 20:15 Zinn 阅读(191) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3230 先算出每个后缀贡献子串的区间; 然后前缀LCP直接查询,后缀LCP二分长度,查询即可; 注意本质不同的子串的个数是 long long 级别!! 于是读入有 long long —— 快 阅读全文
posted @ 2018-12-07 17:17 Zinn 阅读(182) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4453 这种问题...一般先把询问离线,排序; 区间对后缀排名的影响在于一些排名大而位置靠后的后缀可能因为区间右端点截掉了后面而排名变小; 考虑如何影响:如果 i < j rk[i] > rk[ 阅读全文
posted @ 2018-12-07 15:42 Zinn 阅读(185) 评论(0) 推荐(0)
摘要:题目:http://poj.org/problem?id=3415 先用后缀数组处理出 ht[i]; 用单调栈维护当前位置 ht[i] 对之前的 ht[j] 取 min 的结果,也就是当前的后缀与之前后缀的LCP,其中长度 >= K 的加到答案; 因为单调栈中是一段一段阶梯状的,只存了一段端点的位置 阅读全文
posted @ 2018-12-06 20:58 Zinn 阅读(203) 评论(0) 推荐(0)
摘要:题目:http://codeforces.com/contest/504/problem/E 快速查询LCP,可以用后缀数组,但树上的字符串不是一个序列; 所以考虑转化成序列—— dfs 序! 普通的 dfs 序中,子树是一段连续的区间,而这里要查询的是链,自然想到树链剖分后的 dfs 序; 这样一 阅读全文
posted @ 2018-12-06 17:08 Zinn 阅读(273) 评论(0) 推荐(0)
摘要:题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4278 每次取两个后缀中字典序较小的那个的首字符; 注意超出去的部分是 inf 而不是 0,因为如果到了比较超出去部分的时候,那就是一个串走到了末尾而另一个没有(或者都到末尾,不过都到末尾就随便 阅读全文
posted @ 2018-12-06 11:33 Zinn 阅读(132) 评论(0) 推荐(0)
摘要:题目:https://www.luogu.org/problemnew/show/P3809 刚学了后缀数组,看人家手写演示了半天,大概明白了过程,但完全写不出来代码; 于是借鉴了许多,不过都差不多,总算会写了; 如何把想法实现出来很重要啊... 代码如下: 阅读全文
posted @ 2018-07-18 16:17 Zinn 阅读(345) 评论(0) 推荐(0)