题解:B4323 [科大国创杯小学组 2025] 改写
问题描述
给定一个字符串 \(s\),它由若干段构成。每一段由一个小写字母 \(c\) 和一个正整数 \(len\) 表示,表示该段由 \(c\) 重复 \(len\) 次构成,且相邻段的字母不同。
要求将 \(s\) 划分成若干个非空子段,要求每个子段都不是回文串,即对任意子段 \(r\),必须满足 \(r_1 \ne r_m\)。其中 \(r_1\) 和 \(r_m\) 分别为子段的首尾字符。目标是让划分出的子段数最多,并输出这个数量;如果无解,输出 \(-1\)。
Solution
第一眼以为要动态规划,其实是个很简单的贪心,下面进行分讨。
1. 特殊情况
-
当 \(n=1\) 时,整个字符串由一段构成,所有字符均相同,必然构成回文,所以无解,输出 \(-1\)。
-
当 \(n=3\) 时,如果满足 \(c_1=c_3,len_1=len_3,len_2=1\),
那么无论如何划分,都必然存在某个子段为回文,此时输出 \(-1\)。
2. 分情况讨论
(1)所有段的长度都为 \(1\)。
此时整个字符串 \(s\) 表示为交替排列的字符,每一段都只有一个字符。注意划分时需要保证子段长度为偶数(因为偶数长度的子段首尾必然不同),否则奇数长度子段会因对称而构成回文。
- 设 \(n\) 为段数,理论上最大的划分数初步为 \(\lfloor n/2 \rfloor\)。
- 但如果所有奇数位置的字符相同(即 $ c_1=c_3=\cdots $),那么在这些位置上可能会强制形成某个奇数长度子段,此时必须将答案减 \(1\)。
- 此外,如果偶数位置的字符也全部相同,则无论如何划分都无法避免回文,输出 \(-1\)。
(2)存在至少一段的长度大于 \(1\)。
这种情况下,由于某段字符数 \(\text{len}>1\),可以利用该段在分割时“破坏”回文的对称性。贪心思想如下:
- 从第 \(1\) 段开始,将第 \(1\) 段作为子段的开始,然后遍历后续段;
- 用一个标志变量记录“当前子段是否已开始”。若标志未开启,则开启;若已开启,则在遇到下一个段时切分,并判断当前段的 \(\text{len}\) 是否大于 \(1\):
- 如果 \(\text{len}>1\),则切分后重新开启一个子段;
- 否则关闭标志,等待后续段拼接。
这样贪心划分能够尽可能多地切分出非回文子段。
综上
- \(n=1\) 或特殊 \(n=3\) 时无解。
- 若所有段均 \(1\),必须保证分割后子段长度为偶数,故需要检查奇、偶位置字符分布,并实时调整答案。
- 存在至少一段长度大于 \(1\) 时,使用贪心灵活切分,获得最多子段数。

浙公网安备 33010602011771号