CF666 刷题记录
序
日期:2024/11/8
内容:CF666(Div. 1)
tag:未在洛谷提交
A
tag:字符串;dp;水题
题意
给定一个字符串,可以把它分解为“词根”和“词后缀”。要求词根长度严格大于 \(4\) ,词缀长度为 \(2\) 或 \(3\) ,相邻的词缀不能相同。求在所有的分解方案中后缀的可能性。
(呜呜呜看错题了写了两个小时)
\(1\le n \le 10^5\)
解法
令 \(dp_{i,0/1}\) 表示第 \(i\) 个位置开始长度为 \(2/3\) 的后缀是否可行。直接做就做完了。
B
tag:图论;最短路;暴力
题意
给定一个有向图,边权为 \(1\) 。选择四个不同的点 \(a,b,c,d\) ,价值 \(w=dis(a,b)+dis(b,c)+dis(c,d)\) ( \(dis(x,y)\) 表示从 \(x\) 到 \(y\) 点的最短路长度,要求最短路存在)。要你给出这四个点的编号,使得加值最大。
\(1\le n\le3000\)
解法
非常暴力,先从每个点开始跑一遍 bfs 算出点之间的距离,然后算出别的到每个点的前三长距离,和每个点到别的点的前三长距离。然后枚举 \(b,c\) ,就可以用预处理出的东西做了。具体而言,\(a\) 选择不是 \(c\) 的离 \(b\) 最远的点,\(d\) 选择不是 \(b\) 的离 \(c\) 最远的点,如果 \(a\) 和 \(d\) 选择了同一个点,就酌情让某方退一步。
C
tag:组合数;dp
题意
求长度为n的,包含s作为子串的由小写字母构成的字符串的数量。
\(1\le n\le 10^5\)
解法
如果组合数暴力枚举所有情况会导致aa这种(在a? ?a中)被计算多次。考虑 \(dp_{i,j}\) 表示字符串前i位匹配到了s中的前j位。转移式为:\(dp_{i,j}=dp_{i-1,j}\times 25+dp_{i-1,j-1}\) 。
这个式子不会算重复,因为这个位置上取 \(s_j\) 的情况(一倍的 \(dp_{i-1,j}\) )被在 \(dp_{i-1,j-1}\) 中算过了,因此从 \(dp_{i-1,j}\times 26\) 中减去。可以理解为,把每个可能算重的连续一段的字母只在第一个位置转移,其余位置当作不是这个字母,就不会算重复。
当然这个式子可以优化。我们发现这个式子和s的具体内容无关,事实上,我们可以用这个式子实现去重。不难发现运用之前的思路可以得出 \(ans=\sum_{i=m}^{n}\binom{n}{i}25^{i-m}26^{n-i}\) 。和之前的思路一样,这个式子枚举s串最后一个字符匹配了哪个位置,然后统计次数时,不允许每个位置与下一个 \(s_i\) 相同,这样就只在每个重复段开头统计了,没有重复。(数学证明我不会,或需要用二项式反演)
最后记忆化可以优化到 \(O(\sqrt{n})\)。

浙公网安备 33010602011771号