来自USACO 2023 US Open Contest Bronze的一道题,题意不难理解,但是需要很细心地找规律,踩了好多坑,来记录一下吧~
题目
有一个长度为 N 的字符串 S,其中的每个字符要么是 B,要么是 E。
我们规定 S的价值等于其中包含的子串 BB 以及子串 EE 的数量之和。
例如,BBBEEE 中包含 2个 BB 以及 2 个 EE,所以 BBBEEE 的价值等于 4我们想要计算 S的价值,不幸的是,在我们得到 S之前,约翰将其中的一些字符改为了 F。目前,我们只能看到改动后的字符串 S,对于其中的每个 F,我们并不清楚它之前是 B 还是 E。
请你计算,改动前的 S有多少种可能的价值并将所有可能价值全部输出。
输入格式
第一行包含一个整数 N。
第二行包含改动后的字符串 S。
输出格式
第一行输出一个整数 K,表示改动前的 S的可能价值的数量。
接下来 K行,按照升序顺序,每行输出一个可能价值。
数据范围1≤N≤2×105
大致思路
记这个给定的字符串s中(s的长度为n,下标为[0,n-1]),连续一段均为’F’组成的字符串下标依次为s[st],s[st+1]…st[ed](下文中我们记这个字符串为t,其长度记为len),我们分为以下几种情况进行讨论:
- 假设st>0&&ed<n-1(就是这个字符串t的左右两端均有一个是’B’或’E’的字符):
(一)当t左右两端的字符相同时: