1 条题解
-
0
根据你的要求,我已将上一份题解中所有数字和数学公式(包括变量、表达式、运算符号等)严格用单个
$包裹。修改后的题解如下:
D. “a” 字符串问题 详细题解
题目重述
给定一个由小写字母组成的字符串 ,统计所有非空字符串 的个数,满足可以将 划分成若干子串,每个子串要么等于 ,要么等于单个字符 ,且至少有一个子串等于 。
划分指将 表示为 (拼接)。
核心观察
设 中所有非 字符的位置为 ( 为非 的个数)。由于划分中只允许出现 或单个 ,任何非 字符只能被 段覆盖。 段可以重复出现,也可能只出现一次。因此我们将符合条件的 分为两大类:
- 周期重复型: 在 中作为“基本块”多次出现,覆盖所有非 字符,其余部分均为单个 。这要求所有非 字符的位置相对第一个非 字符的位置之差具有周期性,且 的内容由这些位置决定。
- 单一 段型: 只出现一次,其余部分全是 。此时 必须是一个包含所有非 字符的连续子串。
两类解可能有重叠,需要容斥。
符号定义
- 。
- 非 位置:。
- 令 ,。
情况一:全为
若 ,则 仅由 组成。任何 必须全部由 构成(因为划分中只能出现 或 )。因此 可以是长度 到 的任意全 串,共 个。
情况二:只有一个非 字符
此时 ,。 必须包含这个唯一的非 字符,且 可以是任意一个包含该字符的连续子串(长度至少 )。由于 不能等于 ,所以如果该非 字符本身不是 ,则长度为 的 就是它本身,合法。因此所有可能的 为:左端点可以从 到 ,右端点可以从 到 ,且左端点 右端点。这样的子串共有 个。
情况三:多个非 字符()
3.1 周期重复型
假设存在一个 重复出现多次(可能夹杂单个 )。设 的长度为 。那么所有非 字符的位置必须满足:存在一个参考起点 ( 段的起始位置),使得每个 与 的差是 的整数倍,且 等于 中对应的字符。由于 是第一个非 字符,它必然落在第一个 段内。我们可以将 取为 或者更左的位置?实际上,因为 段可以前面有若干个 字符, 不一定正好是 的起始。记 段的起始下标为 ,则 ,且 ()。那么所有非 字符的位置满足 ,且 (其中 的第 个字符为 )。由于 是第一个,, 未知。但是,我们可以通过枚举 来考虑,但复杂度可能较高。
更简洁的方法:注意到 段在 中必须完整出现,且所有非 字符的相对模式由 决定。另一种常见思路是:如果忽略开头的 前缀,直接令 作为候选。然而 的起点也可能在 的左边(例如 中, 从位置 开始,而 )。直接枚举所有可能的 和偏移量 会超时。
观察可知, 的长度 必须整除所有差值 的最大公约数 ,即 。这是因为 必须是 的倍数(因为 和 在同一个 段内或不同段?实际上,若 重复出现,则任意两个非 字符之间的差都是 的整数倍,所以 是 的倍数。因此 是这些差值的公约数,从而 。因此可能的 只能是 的正因子。
但 的起始位置不一定是 。若 ,我们可以将 的起始点选为 或更左的位置?考虑到 在第一个 段内的偏移量 可以取 到 ,但 必须使得 等于 ,且 就是 (因为 对应 的第 个字符)。所以我们实际上需要根据可能的 来构造 ,但 的唯一作用是决定 与 的相对位置。由于我们关心的是 的字符串内容,而不是它的绝对起始位置,我们可以将 定义为从 开始到 的子串。然而,枚举 需要 ,总复杂度可能较大。
一个更简单的处理是:直接枚举所有可能的 段长度 ( 的因子),并假设 以 为起始,即 。然后检查这样定义的 是否能够通过将 划分为 和 来覆盖整个字符串。如果通过,则 是一个合法解。这个做法会漏掉那些 起始于 左侧的情况吗?事实上,如果存在一个合法的 起始于 ,那么我们可以将 到 的这段前缀全部由 组成(因为 是第一个非 字符,所以这段前缀全是 )。因此,将 的起始点向右移动到 并不会破坏划分:只需将前面的 段独立出来, 段改为从 开始即可。但这样 的内容会改变(因为从 开始取 个字符不等于原来的 )。所以不能直接移动。实际上,若 起始于 ,则 的前 个字符全是 ,后面部分才是非 模式。而 不能是 ,所以 中至少有一个非 字符。那么 的右段(从位置 开始)就是 的后缀。是否有可能这个后缀本身也是一个合法 ?不一定,因为 可能以多个 开头。但我们可以观察到,如果 以 开头,那么它前面的那些 也可以单独作为 段,而 实际上可以缩减为去掉这些前导 的版本。因为划分中允许单独的 ,所以 的前导 完全可以分离出去。因此,任何合法 都可以通过去掉前导连续 得到一个不以前导 开头的等价 ,且 的第一个字符就是 (因为 是第一个非 )。所以 必定从 开始。因此,我们只需要考虑那些以 为起点的 (即 ),然后再检查合法性。这样不会漏解。同理, 也可以有后缀 ,但后缀 可以归入后续的 段,不影响划分。
因此,我们只枚举长度 为 的正因子,并且令 。然后检查是否能用 和 划分 :从 开始扫描,如果 则跳过(作为单独 段);否则尝试匹配 ,若匹配成功则跳过 个字符并记录使用了 ,否则失败。最后还要保证至少使用了一次 。若扫描成功,则 是一个合法解。
3.2 单一 段型
只出现一次,其余部分全是 。那么 必须是一个包含所有非 字符的连续子串,即左端点 可以取 到 的任意值,右端点 可以取 到 的任意值,且 。显然,这样的子串共有 个。注意 本身不能是 ,但由于 包含至少一个非 字符,自动满足。
3.3 重叠部分(容斥)
某些 既属于周期重复型,又属于单一 段型。也就是那些长度 满足 (因为要包含整个非 区间)且通过周期检查的 。这些 在两类中被重复计数,需要减去一次。因此最终答案为:
$$\text{ans} = \text{period\_cnt} + (L+1)(n-R) - \text{overlap} $$其中 是按上述扫描判定的合格长度个数, 是其中满足 的个数。
边界情况:整个字符串 本身
当 本身作为 时,它显然属于周期重复型(,此时 且 必须是 的因子才会被枚举到)。如果 且 是 的因子,则 会被枚举且通常通过检查(只要 本身满足自己的模式),所以它已被计入 。否则( 或 不是 的因子), 本身不会被周期枚举覆盖,但它显然是合法解(单一 段型中 已经包含)。因此无需额外处理。但在实现中,单一 段型已经包含了整个字符串,所以周期解中若包含整个字符串会产生重叠,容斥会处理。
算法步骤总结
- 读入 ,。
- 找出所有非 的位置 。若 为空,输出 。
- 令 ,,。
- 若 ,输出 。
- 计算 。
- 枚举 的所有正因子 :
- 若 则跳过。
- 令 。
- 检查所有非 字符是否满足 。若不满足,跳过。
- 扫描整个 ,模拟划分:从 开始,若 则 ;否则若 且 ,则 并标记已使用 ;否则失败。
- 若成功且使用了 ,则 ,若 则 。
- 计算 。
- 输出 $\text{period\_cnt} + \text{span\_cnt} - \text{overlap}$。
正确性证明
- 必要性:任何合法 若非单一 段型,则必然重复出现,此时所有非 位置的间距是 的倍数,所以 整除 。且 的第一个非 字符一定在位置 (因为 是最左非 ),所以 可以取为 。然后扫描验证必然通过。
- 充分性:若一个长度 是 的因子且满足扫描验证,则构造的划分即为合法划分, 符合条件。
- 单一 段型的计数显而易见。
- 容斥正确去除重叠部分。
复杂度
- 计算 及其因子:,。
- 对每个因子 ,检查所有非 字符需要 ,扫描整个字符串需要 。因子个数通常较小( 时最多约 ),总复杂度 ,在 总和 下可接受。
示例验证
- :全 ,输出 。
- :,,因子 。:,扫描成功,计入;:,扫描成功,计入。。重叠: 不,,无重叠。答案 ,正确。
总结
本题的关键在于观察到所有非 字符的间距必须具有周期性, 是这些间距最大公约数的约数,并且 可以从第一个非 字符开始取。同时,包含所有非 字符的连续子串也是合法解。通过枚举 的因子并模拟划分,即可计算所有符合条件的 。复杂度在数据范围内可行。
- 1
信息
- ID
- 6942
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者