[题解: FEB ]

来自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),我们分为以下几种情况进行讨论:

  1. 假设st>0&&ed<n-1(就是这个字符串t的左右两端均有一个是’B’或’E’的字符):
     (一)当t左右两端的字符相同时:
      
  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值