题解: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\) 时,使用贪心灵活切分,获得最多子段数。

link

posted @ 2025-04-21 18:25  薛儒浩  阅读(92)  评论(0)    收藏  举报