后缀自动机
Neo__Z
这个作者很懒,什么都没留下…
展开
-
bzoj3998 弦论 后缀自动机
题目大意:对于给定的一个长度为n的字符串S,求其第k小的子串。询问有两种,一种不重复(本质不同)的子串,另一种要计算重复(位置不同)的子串。题解:首先我们可以建一个后缀自动机。 然后每条路径走到每个点都是一个串,它们是有字典序的。 我们只需要统计出往每个点走之后都有多少串(sum[i]sum[i])就好了。 sum[i]=∑sum[son[i]]+val[i]sum[i]=\sum su原创 2017-07-25 16:28:57 · 257 阅读 · 0 评论 -
SPOJ 1812 Longest Common Substring II 后缀自动机求多字符串最长公共子串
题意:给若干字符串,求它们的最长公共子串的长度。题解:后缀自动机。对第一个串建立SAM,并拓扑排序。 用后面的串分别匹配。 对于SAM,每个节点新增两个值ml,ans; ans代表该节点满足所有字符串的最大值,初始化为该字符串建立时的最大值,每次匹配后更新。 ml代表该节点满足单一字符串时的最大值,匹配完一个字符串后重置为0; 每次匹配完字符串,按照拓扑排序从后往前更新(保证父节点在子节点原创 2017-07-25 19:01:25 · 678 阅读 · 1 评论 -
spoj 8222 substrings 【后缀自动机】
解题思路:建立sam,那么一个节点i所对应的字符串出现次数即为其right集合大小,而其包含字符串长度为(min[i],max[i]),且随着parent链代表字符串长度减小,其出现次数单赠。所以先令f[max[i]]=right[i],最后用f[i]更新f[i-1]即可。#include<iostream>#include<cstdio>#include<cstring>#include<s原创 2017-12-14 09:53:20 · 278 阅读 · 0 评论 -
bzoj3926 诸神眷顾的幻想乡【后缀自动机】
解题思路:题目要求的即是在trie树上建立sam后,本质不同的子串个数。 又由于从不同叶子的方向有不一样的串,所以要把以不同叶子为根的20棵tried树合并为一个大tried树来做即可。这里有两种求本质不同的子串个数的方法: 1.每条路径走到每个点都是一个串,所以我们只需要统计出往每个点走之后都有多少串(用f[i]表示)就好了,这种做法要先按max值拓扑排序后反拓扑序计算。 即是f原创 2018-01-28 20:08:26 · 232 阅读 · 0 评论 -
BJ模拟 String【后缀自动机+LCT+可持久化线段树】
题目描述:给你一个长度为n的字符串S,你需要维护这个字符串S并支持两种操作: 1、在字符串S末尾插入一个字符。 2、记字符串T为字符串S从第 l 个字符到第 r 个字符所构成的子串。询问字符串T中最长的子串使得该子串在T中出现过至少两次(例如:T=”ababa”,最长的子串应为aba,长度为3),并输出它的长度。如果不存在这样的子串,则输出0。 强制在线,n,m<=50000。...原创 2018-04-23 10:49:55 · 547 阅读 · 0 评论 -
BJ模拟 Problem B: Mr. Panda and Fantastic Beats【广义SAM】
题目描述:给出 nnn 个字符串 S1,S2,...SnS1,S2,...SnS_1,S_2,...S_n,求S1S1S_1中最短的子串满足其不是S2,...,SnS2,...,SnS_2,...,S_n的子串。字符串总长不超过250000。解题思路:将所有串建立广义SAM,维护每个点id的最大值即可判断其是否唯一是 S1S1S_1 的子串,然后贪心找合法串即可。#includ...原创 2018-05-09 19:08:42 · 191 阅读 · 0 评论