FEB选择(蓝桥杯JAVA C组)

简介: FEB选择(蓝桥杯JAVA C组)

有一个长度为 N 的字符串 S,其中的每个字符要么是 B,要么是 E。


我们规定 S 的价值等于其中包含的子串 BB 以及子串 EE 的数量之和。


例如,BBBEEE 中包含 22 个 BB 以及 22 个 EE,所以 BBBEEE 的价值等于 44。


我们想要计算 S 的价值,不幸的是,在我们得到 S 之前,约翰将其中的一些字符改为了 F。


目前,我们只能看到改动后的字符串 S,对于其中的每个 F,我们并不清楚它之前是 B 还是 E。


请你计算,改动前的 S 有多少种可能的价值并将所有可能价值全部输出。


输入格式

第一行包含一个整数 N。


第二行包含改动后的字符串 S。


输出格式

第一行输出一个整数 K,表示改动前的 S 的可能价值的数量。


接下来 K 行,按照升序顺序,每行输出一个可能价值。

数据范围

1≤N≤2×10^5

输入样例1:
1. 4
2. BEEF
输出样例1:
2
1
2
输入样例2:
1. 9
2. FEBFEBFEB
输出样例2:
2
2
3
输入样例3:
1. 10
2. BFFFFFEBFE
输出样例3:
3
2
4
6

思路:分情况讨论当F为E或者是B时对得分的影响

分好情况后,我们看两端和中间,两端算一次,中间算一次。、

然后合并,需要注意合并的时候,公差都为2的两个数列合并后还是公差为2的数列,一个为1一个为2合并后公差为1。

两端其实就是情况2,代码如下:

int l=0,r=n-1;
    while(s[l]=='F')l++;
    while(s[r]=='F')r--;
int ends=l+n-1-r,d=2;
    if(ends)high+=ends,d=1;

中间的话最大值就是使所有的F为相同的E或者B,最小就是使B和E交替出现。代码如下:

for(int i=l;i<=r;i++)
        {
            if(str[i]=='F')
            {
                if(str[i-1]=='B')str[i]='E';
                else str[i]='B';
            }
            if(i>l&&str[i]==str[i-1])low++;
            
        }
        
        str=s;
        for(int i=l;i<=r;i++)
        {
            if(str[i]=='F')str[i]=str[i-1];
            if(i>l&&str[i]==str[i-1])high++;
        }

完整代码:

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int n;
string s;
int main(){
    cin>>n>>s;
    if(s==string(n,'F')){
        cout<<n<<endl;
        for(int i=0;i<n;i++){
            cout<<i<<endl;
        }
    }
    else {
        
        int l=0,r=n-1;
        while(s[l]=='F')l++;
        while(s[r]=='F')r--;
        string str=s;
        int low=0,high=0;
        for(int i=l;i<=r;i++)
        {
            if(str[i]=='F')
            {
                if(str[i-1]=='B')str[i]='E';
                else str[i]='B';
            }
            if(i>l&&str[i]==str[i-1])low++;
            
        }
        
        str=s;
        for(int i=l;i<=r;i++)
        {
            if(str[i]=='F')str[i]=str[i-1];
            if(i>l&&str[i]==str[i-1])high++;
        }
        int ends=l+n-1-r,d=2;
        if(ends)high+=ends,d=1;
        cout<<(high-low)/d+1<<endl;
        for(int i=low;i<=high;i+=d){
            cout<<i<<endl;
        }
    }
}
相关文章
|
29天前
|
算法 搜索推荐 Java
【潜意识Java】深度解析黑马项目《苍穹外卖》与蓝桥杯算法的结合问题
本文探讨了如何将算法学习与实际项目相结合,以提升编程竞赛中的解题能力。通过《苍穹外卖》项目,介绍了订单配送路径规划(基于动态规划解决旅行商问题)和商品推荐系统(基于贪心算法)。这些实例不仅展示了算法在实际业务中的应用,还帮助读者更好地准备蓝桥杯等编程竞赛。结合具体代码实现和解析,文章详细说明了如何运用算法优化项目功能,提高解决问题的能力。
59 6
|
29天前
|
算法 Java C++
【潜意识Java】蓝桥杯算法有关的动态规划求解背包问题
本文介绍了经典的0/1背包问题及其动态规划解法。
48 5
|
8月前
|
Java
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
2016届蓝桥杯大赛软件类国赛Java大学B组 愤怒小鸟 数学模拟
67 4
|
8月前
|
Java
蓝桥杯Java组暴力递归搜图
蓝桥杯Java组暴力递归搜图
45 4
|
8月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
63 3
|
8月前
|
Java
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
2021蓝桥杯大赛软件类国赛Java大学B组 完全日期 复杂遍历搜索
68 2
|
8月前
|
Java
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
2023届蓝桥杯大赛软件类国赛Java大学B组 互质 数论
50 1
|
8月前
|
Java
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
2023蓝桥杯大赛软件类省赛Java大学B组G题 买二增一 队列的简单应用
55 1
|
8月前
|
存储 前端开发 算法
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
2016届蓝桥杯大赛软件类国赛Java大学B组 反幻方 暴力搜索
45 0
|
8月前
|
算法 Java 编译器
第十五届蓝桥杯Java软件开发大学B组自我经验小结
第十五届蓝桥杯Java软件开发大学B组自我经验小结
69 0