杂题

1

给定一个长度为 S 字符串 s 与 一个正整数 q,接下来有 q 次询问,第 i 次询问给出一个长度为 Ti 字符串 ti,求 tis 的出现次数。

保证 S,q,i=1qTi105

Solution

后缀自动机,但是我不会。

注意到 i=1qTi105,则 Ti 的种类至多有 105316 种,那么就可以对每一种长度相等的 t 一起处理,可以使用 Hash 在 O(n) 的时间复杂度进行计算。这样时间复杂度就是 O(nn) 的。

2

给定一个元素个数为 n 的可重集 A,进行 n1 次操作。每一次操作可以选择可重集内的两个数,删除这两个数,插入这两个数的差值。

显然,在进行 n1 次操作后这个集合会只剩下一个数。最大化这个数。

n100。设初始集合内第 i 个元素为 Ai,保证 in,1Ai105

Solution

设最终的这个数为 s,初始集合中最大的数为 Amax

显然有: sAmax

那我们就可以将最大值单独拎出来,剩下的数去操作成最小的可能的数。

设集合 B{x|xA  and  xAmax}

考虑这个最小的数的构成,一定是 B 中的数加加减减得来的。

举个例子,比如 101420,显然这三个数能构成的最小的数为 42014=6,106=4)。这个 4 能表示为 10(2014)=1020+14

我们发现,当这些操作步骤合并并去除所有括号后,它一定能表示成下面这种形式:

x1+x2+x3+...+xny1y2y3...ym

(x1+x2+x3+...+xn)(y1+y2+y3+...+ym)

所以求这个最小的数等价于:将 B 划分成两个集合,使得这两个集合的元素和的差值最小。

做个背包就行了。注意到值域能到达 100×105=107,普通的背包是过不了的,需要使用 bitset 优化。

相似的题目:CF1038D Slime

3

对于字符串 s ,定义镜像操作为:s=s1s2s3...snsn1sn2...s1

如:对于 s=abcs=abcba

现给定一字符串 S,求有多少个字符串 T 使得 ST... 的前缀。

这里的 T... 指的是 T 在进行若干次镜像操作后的字符串。

|T| 为字符串 T 的长度。

显然,对于所有的 |T|>|S| 一定有解,请求出所有 |T||S| 的可能的长度。

多测,|S|106,|S|5×106

Solution

队友写的都是 O(nlogn) 的做法,这里提供 O(n) 的做法。

下文的合法指的是某个字符串在经过若干次操作后能满足题目要求。

首先有两个很显然的结论:

  1. 对于题目所求的所有的 T,都一定是 S 的前缀。

  2. 任意的一个 T,进行一次镜像操作后长度一定是 2|T|1,且操作后所得的串一定是回文串。

si=S1S2...Sipisi 的最大回文半径。显然,pi 可以使用 manacherO(n) 的时间复杂度内算出来。

对于 i|S|2,判断一下 si 是否大于 pi 即可。

对于 i|S|2si 显然一定需要经过不少于 2 次镜像操作长度才能超过 |S|

我们发现对于一个合法的 isi 至少要与 s2i1 相等。

那么我们就可以设 fisi 是否为合法前缀。先预处理出 i|S|2 的部分,然后 i|S|2 的部分我们有: fi=f2i1&ipi

这里 & 表示逻辑与。

逆推即可。

posted @   osfly  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示