08 2020 档案

摘要:思路:一眼看过去,好像处理出每个字串的最小表示的 \(hash\) 值就可以解决了, 但想了复杂度明显过不去,由于要统计某种子串个数,所以首先想到后缀自动机,然后分析,我们将每次查询的模式串翻倍(接在自身后面),模式串的原本长度为 \(n\) ,假设我们现在在后缀自动机上找到了区间 \((le, r 阅读全文
posted @ 2020-08-07 21:09 从小学 阅读(69) 评论(0) 推荐(0) 编辑
摘要:题解:其实这题的本质就是维护连通块个数。 线段树维护可撤销并查集,我们以每次修改作为时间,记录条边出现的时间段,并且用线段树维护这些时间段,线段树的每个结点开一个 \(vector\) 数组, 每个结点代表一个时间区间,若边 \((u, v)\) 在节点 \(rt\) 对应的时间段存在,则 \(ve 阅读全文
posted @ 2020-08-05 18:20 从小学 阅读(291) 评论(0) 推荐(1) 编辑
摘要:题解:先对每个模式串建立一个后缀自动机,计算出子串的种类个数,再把文本串加上去,再计算一次子串种类个数,最后相减就好了 #include <bits/stdc++.h> using namespace std; #define fi first #define se second typedef l 阅读全文
posted @ 2020-08-05 14:57 从小学 阅读(102) 评论(0) 推荐(0) 编辑
摘要:题解:首先广义 \(SAM\) , 然后分析,每次查询需要查的字串是确定,并且给了你右端点,所以我们在插入文本串 (一开始给的字符串) 时,记录一下第 \(i\) 个字符插入时所对应的节点,然后我们根据后缀链接往上爬,直到爬到一个节点 \(p\) 满足的 \(minLen[p] \leq p_r - 阅读全文
posted @ 2020-08-04 21:20 从小学 阅读(145) 评论(0) 推荐(0) 编辑
摘要:题解:\(bin\) 巨的题解其实已经很详细了,这里讲几个可能会踩到的坑,\(kmp\) 求最小循环节时我们要先把原来的串翻倍,也就是在串后面再接上这个串本身,因为 \(kmp\) 中的 \(len - next[len]\) 所得出来的循环节长度是可能的最小循环节长度,但我们要求的是准确的,比如 阅读全文
posted @ 2020-08-04 20:32 从小学 阅读(279) 评论(1) 推荐(0) 编辑