摘要: "题意" 显然加上一个数相等就是差分数组相等,于是问题变为求几个串的最长公共子串。 这里我学习了如何用SA求LCS。 首先问题要转化成求一些后缀的最长公共前缀,要求这些后缀分属不同的串。 于是二分答案,于是问题就变成求一段连续的$height$数组,它们都$\geqslant mid$,并且至少分属 阅读全文
posted @ 2019-12-17 21:31 nofind 阅读(109) 评论(0) 推荐(0) 编辑
摘要: "题意" 考虑二分答案$mid$,现在我们要判断$s[c...c+mid 1]$是否在$s[a...b]$出现过。 首先找到$s[c...c+mid 1]$所在的状态: 建出$parent\ tree$,从$s[1...c+mid 1]$的节点(这个可以记录)用倍增向上跳到最后一个$len\geqs 阅读全文
posted @ 2019-12-17 19:54 nofind 阅读(174) 评论(0) 推荐(0) 编辑
摘要: "题意" 显然是贪心。 先建出SAM,之后能走相同的字符就走相同的字符,实在不行再走一个比它大的。 考虑怎么处理$[l,r]$的限制,我们只要用线段树合并维护出每个点的endpos集合,到时候判断下走这一步是否合法即可。 code: 阅读全文
posted @ 2019-12-17 19:50 nofind 阅读(142) 评论(0) 推荐(0) 编辑
摘要: "题意" 考虑第一问所求即为该串对应的节点的子树内终止节点的个数,而插入一个字符相当于在新增节点到根节点的链+1,于是用LCT维护。 code: 阅读全文
posted @ 2019-12-17 16:44 nofind 阅读(89) 评论(0) 推荐(0) 编辑
摘要: "题意" 因为一个$k$相似必定为$k 1,k 2....0$相似,对于一个$lcp$为$k$后缀对$(i,j)$,我们只用把它的贡献加在$k$的答案上,最后求一个后缀和和后缀max就可以得到答案。 考虑如何快速计算后缀对的贡献: 因为后缀对$(i,j),i j$的$lcp$是$min_{k=i+1 阅读全文
posted @ 2019-12-17 14:29 nofind 阅读(141) 评论(0) 推荐(0) 编辑
摘要: "题意" 承接 "上篇题解" 考虑两个后缀的$lcp$是什么,是将串反着插入后缀自动机后两个前缀(终止节点)的$lca$!!!于是可以在parent tree上DP了。 比后缀数组又简单又好写跑的还快。 code: 阅读全文
posted @ 2019-12-17 14:27 nofind 阅读(107) 评论(0) 推荐(0) 编辑
摘要: "题意" 考虑将$s1$和$s2$接在一起求出相同子串个数,再求出$s1$自己匹配的相同子串个数和$s2$自己匹配的相同子串个数减去即可。 如何求相同子串个数: 我们知道子串的集合即所有后缀的前缀集合,于是实际上答案就是: $\sum\limits_{i=1}^n\sum\limits_{j=i+1 阅读全文
posted @ 2019-12-17 10:15 nofind 阅读(99) 评论(0) 推荐(0) 编辑
摘要: "题意" 考虑式子前面那段其实是$(n 1) \frac{n (n+1)}{2}$,因为每个后缀出现了$n 1$次,后缀总长为$\frac{n (n+1)}{2}$。 现在考虑后面怎么求: $\sum\limits_{i=1}^{n}\sum\limits_{j=i+1}^nlcp(sa_i,sa_ 阅读全文
posted @ 2019-12-17 08:57 nofind 阅读(107) 评论(0) 推荐(0) 编辑