摘要: "bzoj" "luogu" 题目描述 阿米巴是小强的好朋友。 在小强眼中,阿米巴是一个作文成绩很高的文艺青年。为了获取考试作文的真谛,小强向阿米巴求教。阿米巴给小强展示了几篇作文,小强觉得这些文章怎么看怎么觉得熟悉,仿佛是某些范文拼拼凑凑而成的。小强不禁向阿米巴投去了疑惑的眼光,却发现阿米巴露出了 阅读全文
posted @ 2018-03-27 22:28 租酥雨 阅读(489) 评论(0) 推荐(2) 编辑
摘要: "bzoj" "luogu" 题意 有一棵树,每个节点上有一个字符,一条路径上的字符连起来就是一个字符串。求树上一共有多少个不同的字符串。 $n\le10^5$,字符集大小$c\le10$,只与一个空地相邻的空地数量不超过20个。 sol 最后一句话是这道题的关键。 什么叫做“只与一个空地相邻的空地 阅读全文
posted @ 2018-03-27 22:06 租酥雨 阅读(226) 评论(0) 推荐(0) 编辑
摘要: "bzoj" 题意 给出$n$个串,求每个串中有多少个子串在至少$k$个串中出现过。 sol 广义后缀自动机。 先建好广义SAM,也就是把这$n$个串全都插到SAM里面去,那么可以维护每个状态在哪些串里面出现过。 可以给每个状态维护一个$set$,然后向上合并就是直接并起来。 这里我写基数排序结果鬼 阅读全文
posted @ 2018-03-27 21:57 租酥雨 阅读(292) 评论(0) 推荐(0) 编辑
摘要: "bzoj" "luogu" 题意 求一个串的第k小子串,不同位置上的相同内容的子串有时会视作同一子串,有时视作不同子串。 sol 基数排序处理$size$。 “不同位置上的相同内容的子串是否视为相同”决定了一个状态对答案的贡献到底是$endpos$集合大小还是$1$。 除此之外就是第$k$小的查询 阅读全文
posted @ 2018-03-27 21:47 租酥雨 阅读(243) 评论(0) 推荐(0) 编辑
摘要: "luogu" 题意 给一个串,求其第k小子串。 不同位置出现的内容相同的子串算作同一个子串。 有多组询问。 $n\le9 10^4,T\le500$ sol 建出SAM后跑一遍基数排序,预处理出每个状态可以转移到的子串个数。 然后就变成了一个比较经典的第$k$小问题:假设当前面临状态$now$,若 阅读全文
posted @ 2018-03-27 21:37 租酥雨 阅读(296) 评论(0) 推荐(0) 编辑
摘要: "vjudge" 题意 求多个串的最长公共子串 sol 首先拿第一个串建SAM。 然后对于每一个串,在SAM上跑匹配。 那么最终就是要把多个串跑出匹配的信息合并起来。 具体来说,对每个串记录一下在每个状态上的最长长度,然后同一个状态上对每个串的最长长度取个$min$,最后再把每个状态取个$max$。 阅读全文
posted @ 2018-03-27 21:27 租酥雨 阅读(273) 评论(0) 推荐(0) 编辑
摘要: "vjudge" 题意 求两个串的最长公共子串 sol 一个串建SAM,另一个串在SAM上跑匹配。 每次维护一下当前的最长长度就可以了。 code cpp include include include using namespace std; const int N = 5e5+5; int n, 阅读全文
posted @ 2018-03-27 21:22 租酥雨 阅读(146) 评论(0) 推荐(0) 编辑
摘要: "bzoj" "luogu" 题意 求一个串每个前缀中含有多少个不同字串 $n\le100000$,字符集大小$10^9$ sol 后缀自动机的转移开个$map$就好了。 每次插入以后,新增的贡献就是$len[last] len[fa[last]]$。 累加即可。 code cpp include 阅读全文
posted @ 2018-03-27 21:17 租酥雨 阅读(205) 评论(0) 推荐(0) 编辑
摘要: "vjudge" 题意 求长度为$i$的子串在原串中出现次数的最大值。 sol 还是直接求$endpos$集合大小。 最后做一遍后缀最大值,因为很明显答案单调不增。 code cpp include include include using namespace std; const int N = 阅读全文
posted @ 2018-03-27 21:13 租酥雨 阅读(153) 评论(0) 推荐(0) 编辑
摘要: "luogu" 题目描述 给定一个只包含小写字母的字符串$S$ , 请你求出$S$的所有出现次数不为$1$的子串的出现次数乘上该子串长度的最大值。 sol “出现次数大于$1$”也就是$endpos$集合大小大于$1$。 所以可以直接上基数排序求每个状态的$endpos$集合大小。 (我可能比较无聊 阅读全文
posted @ 2018-03-27 21:09 租酥雨 阅读(183) 评论(0) 推荐(0) 编辑
摘要: "vjudge" 题意 给你一个串,求不同字串个数。 $n\le10^5$ sol 直接建SAM然后输出$\sum_{i=1}^{tot}len[i] len[fa[i]]$ code cpp include include include using namespace std; const in 阅读全文
posted @ 2018-03-27 21:04 租酥雨 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 后缀自动机总结 ~~鉴于我觉得也没有人会看我这份总结学SAM,所以这里索性就只放一个板子了。~~ 核心代码在这里: 几个需要注意的地方: 1、$N$的大小要开两倍。 2、$last,tot$的初值是$1$。 3、在字符集比较大的时候$tr$转移可以开$map$,空间复杂度更优秀尽管加那么一点点常数。 阅读全文
posted @ 2018-03-27 20:56 租酥雨 阅读(250) 评论(0) 推荐(0) 编辑
摘要: "vjudge" sol 树DP。 首先把模型转换成:每个点可以控制与它距离不超过$w_i$的点,先要求选出数量最少的点控制所有点。 设$f[i][ 100...100]$表示$i$号点向上还可以额外控制距离为$j$的点的选点最少数量。 $j$为负则表示$j$子树中还有$ (j+1)$深度的点没有控 阅读全文
posted @ 2018-03-27 19:34 租酥雨 阅读(391) 评论(1) 推荐(0) 编辑
摘要: "bzoj" "luogu" sol 很显然的两遍树DP吧。 设$f_i$表示只考虑$i$的子树,$i$点没有电的概率。 $$f_i=q_i \prod_{v是i的儿子}f_v+(1 f_v) (1 p_e)$$ 为了方便表示把后面那一坨记为$h_v$,即$h_i=f_i+(1 f_i) (1 p_ 阅读全文
posted @ 2018-03-27 15:42 租酥雨 阅读(239) 评论(0) 推荐(2) 编辑
摘要: "bzoj" "luogu" sol 首先考虑如果没有硬币数量的限制该怎么做。 直接上背包吧。 直接上背包存在的问题就是不知道硬币的使用数量有没有超出限制。 那就容斥一波。 考虑每种硬币,强制其超出限制,也就是强制先使用$d_i+1$个该种硬币,然后剩下队随便选。 时间复杂度是$O(V+q 2^4) 阅读全文
posted @ 2018-03-27 14:11 租酥雨 阅读(174) 评论(0) 推荐(0) 编辑
摘要: "bzoj" "luogu" sol 根据Nim游戏的原理可知若异或和为零则后手必胜,否则先手必胜。 所以题目的要求其实就是:选出一个总和尽量小的集合,使其补集的任意非空子集队异或和都不为零。 转化一下,去掉一个总和尽量小的集合,也就是保留尽量大。 这也就是 "bzoj2460元素" 那个题了。 而 阅读全文
posted @ 2018-03-27 14:04 租酥雨 阅读(189) 评论(0) 推荐(0) 编辑