杂题小记(2023.02.28)

更好的阅读体验戳此进入

SP2713 GSS4 - Can you answer these queries IV

题面

给定序列,区间开方,区间求和。

Solution

考虑对于 1018 的数最多开方 6 次就会变为 1,则额外维护一个标记表示是否区间均为 01,遇到标记则不继续修改,可以证明复杂度是对数级的。

Code

LG-P4391 [BOI2009]Radio Transmission 无线传输

题面

给定字符串,其是由一个字符串多次重复得到的(是一个串无限重复后串的任意子串),求该字符串的最短长度。

Solution

只能说这题确实高妙!感觉推导过程和 border 的那一套理论差不多。

首先结论就是用 KMP 求出 nxtnnxtn 即为答案。

按照类似 border 某些前置知识的证明思路证明即可,也就是考虑对于减去最长前后缀后剩下的一段,会对应着前缀末尾段,然后再对应到后缀对应段,一直对应下去,发现一定合法。

对于其一定为最优的证明,可以考虑若存在一个更小的循环节,多次循环之后最后会剩一个残块,不考虑这个残块及其影响后一定会形成一个更长前后缀,得证(这东西适合画图李姐一下,口糊肯定很抽象)。

Code

LG-P2375 [NOI2014] 动物园

题面

给定字符串 S,求 S 的每个前缀子串的相同且不重叠前后缀的数量。

Solution

想麻烦了,找了半天性质,实际上很简单。

首先不考虑重叠,对于一般的求数量我们只需要在求 nxt 的时候同时转移一下 num 即可,然后考虑重叠,不难想到重新跑一遍 KMP,对于每次求出来的 nxti 一直跳到 nxtii2,然后取 numnxti 即为答案。

Code

LG-P3193 [HNOI2008]GT考试

题面

求长度为 n 的序列中不存在长度为 m 的子串的方案数。

Solution

首先按照一般思路考虑一个朴素 DP,即令 dp(i,j) 表示匹配了文本串的前 i 位与模式串的前 j 位的方案数,发现并不好进行转移,可能性太多,于是想到可以预处理出 g(i,j) 表示对于模式串,从匹配了前 i 转移到匹配了前 j 的方案数,则转移显然:

dp(i,j)=k=j1mdp(i1,k)×g(k,j)

显然可以等效写成:

dp(i,j)=k=0m1dp(i1,k)×g(k,j)

发现其满足矩阵形式,且 g 为定值,可以通过矩阵快速幂优化。

对于 g 的预处理,考虑 KMP,先朴素跑一遍 KMP,然后枚举每一位,钦定当前的最长前后缀为目前的整个前缀,这是显然的,然后按照一般的 KMP 的匹配思路往前跳到合法能匹配的最长,如此大概统计一下复杂度卡满应该是 O(m2v) 的,其中 v=10 为值域。

Code

LG-P4180 [BJWC2010] 严格次小生成树

题面

求连通图的严格次小生成树。

Solution

存在如下方法,正确性可感性理解,理性证明未知。

考虑任意建出一棵 MST,然后枚举所有没有在 MST 中的边,分别找出每条边的 s,t 对应路径中与该边权值不同的最大权值,本次的答案即为原来 MST 的权值和减去该边的权值加上枚举的原本不在 MST 的边的权值,最终取答案最小值即可。

对于维护可以考虑用树剖 + 线段树,边权下放到点权,然后合并时可以强行讨论,也可无脑开 basic_string 排序后 unique 实现,此写法常数较大但可以通过。

Code

LG-P3403 跳楼机

题面

给定 x,y,z,h,求有多少 k[1,h] 满足 ax+by+cz=k

Solution

经典同余最短路问题,令 f(i) 表示由 y,z 凑成的模 xi 的最小楼层,则有转移 f((i+y)modx)=f(i)+y,f((i+z)modx)=f(i)+z,发现其满足最短路松弛操作的形式,直接以此建图跑一遍,每个 dis 对答案的贡献即为 hdisx+1,最后的 +1 则是取不选 x 的方案,同时注意判断每个是否满足 hdis

Code

UPD

update-2023_02_28 初稿