CF949A Zebras 题解
题意
给定一个仅包含 和 的字符串( 串),你需要将其拆成若干个 不一定连续 的子串,这些子串满足如下条件:
-
首末均为
-
中间 交替
试输出其中任意一种拆分方案。
比如:
1 | |
思路
首先我们可以先观察所有符合
-
首末均为
-
中间 交替
的子串:
1 | |
发现了什么?对于以上的每一个 ,它的左边和右边都有 个 包含它。
如果对应回原串,每一个 的左边和右边都需要找到 个 。
那也就是说,我们可以对于每一个 ,记录一下它所找到的左边的 和右边的 ,然后用一种类似链表的方法把他们串联起来,最后再进行遍历。
暴力做法核心代码
1 | |
然后就会发现在第 8 个点 T 了
满分做法
由于原做法对于每一个 都需要找一遍 ,所以我们可以对其优化。
如果当一个 有多个 可使用时,其实使用哪个都没所谓。
比如拿“1 的左边找 0”做示范:
1 | |
我们可以发现, 位置上的 可使用的 的数量要大于 位置上的 可使用的 的数量。
那么至少在当两个位置 且 时, 可使用的 的数量 可使用的 的数量。
所以说在这里,当我们从左到右遍历的时候,其实前面 的 已经“吃饱喝足”了,剩下的 就由 的 解决就可以了。
我们可以使用 STL,将之前的 放进栈或队列里,使得寻找 的复杂度为 ,使用时只需要 pop 就可以了。
反过来,如果在“1 的左边找 0”里从右到左遍历,第一个 0 给了 ,这就导致 没 0 用了,导致程序输出了错误的答案。
代码
1 | |
CF949A Zebras 题解
https://formu1-github.github.io/Hexo-blog/2022/10/09/CF949A-Zebras-题解/