摘要: 题面:洛谷 题解: 观察到L是可二分的,因此我们二分L,然后就只需要想办法判断这个L是否可行即可。 因为要尽量使L可行,因此我们需要求出对于给定L,这个串最多能匹配上多少字符。 如果我们可以对每个位置i求出g[i]表示以这个位置为结尾,向前最多匹配多少位,就可以快速得知任意区间[l, r]是否可以被 阅读全文
posted @ 2018-12-04 22:49 ww3113306 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 因为对于原串的每个长度不一定等于len的拆分而言,如果合法,它将只会被对应的子串统计贡献。 所以子串这个限制相当于是没有的。 所以我们只需要对于每个位置i求出f[i]表示以i为开头的形如BB这样的串的个数,g[i]表示以i为结尾的形如AA这样的串的个数即可。 考虑分别处理这2个数 阅读全文
posted @ 2018-12-04 22:38 ww3113306 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 我们暴力维护当前所有队伍内的所有子串(长度k = 1 ~ 50)的出现次数。 把每个子串都用一个hash值来表示,每次改变队伍形态都用双向链表维护,并暴力更新出现次数。 现在考虑复杂度。 如果只有连接,没有断开,那么复杂度为不同的子串个数:50n(注意只要O(n)预处理前缀和后缀 阅读全文
posted @ 2018-12-04 22:26 ww3113306 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 做法。。。。非常暴力。 因为要求的编辑距离最多只有1,所以我们直接枚举对那个位置(字符)进行操作,进行什么样的操作,加入/修改/删除哪个字符,然后暴力枚举hash判断即可, 1 #include<bits/stdc++.h> 2 using namespace std; 3 #d 阅读全文
posted @ 2018-12-04 22:18 ww3113306 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 如果我们对这些小串建出AC自动机,那么我们所求的大串就是要求满足遍历过所有AC自动机上的叶子节点,且经过步数最少的串。如果有多个步数相同的串,要输出字典序最小的串。 在AC自动机上DP。 因为我们要求所求串内要出现所有给定小串,而小串个数较少,因此我们考虑状压,然后保存下val[ 阅读全文
posted @ 2018-12-04 22:15 ww3113306 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 其实还可以用AC自动机做,但是没调出来,,,不知道发生了什么。。。 AC自动机做法如下: 观察到如果我们对给定的每个串建AC自动机,那么直接拿大串在上面匹配,如果遇到了一个单词的终止节点,假设当前大串的位置是i,匹配到的节点是j,那么这个单词覆盖了 [i - dep[j] + 1 阅读全文
posted @ 2018-12-04 22:06 ww3113306 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 题意:给定串,对于每个前缀求有多少本质不同的子串。 我们对这个串建后缀自动机,每加入一个字符就更新一次答案,更新一次输出一次。 对于后缀自动机上的每个状态,因为以[MINS, MAXS]中的每个值作为长度都可以表示一个不同的子串,所以这个状态的贡献就是这个区间的长度。 因此建的时 阅读全文
posted @ 2018-12-04 21:51 ww3113306 阅读(112) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 我们对给定串建AC自动机,因为串个数较小,我们考虑状压。 设f[i][j][k]表示走了i步,当前在j号节点上,状态为k的方案数。 同时AC自动机上每个点的val都是对应的到达这个点后可以新增的状态。 每次枚举下一个字符即可转移,在建完自动机之后,记得把fail树上对应的链上的点 阅读全文
posted @ 2018-12-04 21:46 ww3113306 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷(带翻译) 题解: 直接求相交不太好求,所以考虑求不相交的回文串对数。 设ll[i]表示以i为开头的回文串个数,rr[i]表示结尾<=i的回文串个数。 然后不相交的回文串对数显然就是对于每个$rr[i - 1] \cdot ll[i]$求一次和。 最后再用全集减去不相交的回文串对数即可求出 阅读全文
posted @ 2018-12-04 21:36 ww3113306 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 我们考虑,如果可以将环上每个长度为len的串都提取出来,再做个排序,那这题我们就做出来了! 但是提取$n^2$,怎么办? 考虑破环成链,再扩充为原来的2倍。 然后直接做后缀排序,把长度大于len的串按排序结果顺次列下来,对于每个后缀取出前len个字符构成串,最后得到的就是我们要的 阅读全文
posted @ 2018-12-04 21:27 ww3113306 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 题面: 洛谷 题解: 首先我们需要知道一个性质,串s的最小循环节 = len - next[len].其中next[len]表示串s的一个最长长度使得s[1] ~ s[next[len]] == s[len - next[len] + 1] ~ s[len](详细定义参见KMP) 至于为什么是成立的 阅读全文
posted @ 2018-12-04 21:21 ww3113306 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 题面:洛谷 题解: 还是这个性质:对于每个串而言,本质不同的回文串最多只有O(n)个。 所以我们先求出这O(n)个本质不同的回文串,然后对整个串求一次sa。 然后对于每个回文串,求出它的出现次数,更新答案即可。 如何用后缀数组求一个串的出现次数? 因为每个串都必然是某个后缀的前缀。因此我们先找到这个 阅读全文
posted @ 2018-12-04 21:00 ww3113306 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 题面: 洛谷:[SHOI2011]双倍回文‘ 题解: 首先有一个性质,本质不同的回文串最多O(n)个。 所以我们可以对于每个i,求出以这个i为结尾的最长回文串,然后以此作为长串,并判断把这个长串从中间劈开后左边的一半是否也是一个回文串(判断左边那半的中点的回文半径是否可以跨过当前长串的中点)。 复杂 阅读全文
posted @ 2018-12-04 20:51 ww3113306 阅读(154) 评论(0) 推荐(0) 编辑
知识共享许可协议
本作品采用知识共享署名-非商业性使用-禁止演绎 3.0 未本地化版本许可协议进行许可。