中国计量大学现代科技学院第四届“中竞杯”程序设计校赛(同步赛)B题

链接:https://ac.nowcoder.com/acm/contest/9680/B
来源:牛客网

白浅获得了一个仅由A和B组成的字符串。他可以至多使用一次魔法来改变字符串。 魔法的定义:选择一个字典序不递增的子串, 然后使得这个子串变成字典序不递减的子串,即变成形如AAA…AAABBB…BBB这样的字符串。 他想知道,在他至多使用一次魔法后,这个字符串能够出现的最长的字典序不递减的子串的长度为多少。
输入描述:
输入第一行包含一个整数n,代表字符串的长度
接下来一行给出一个长度为n的字符串(1 \leq n \leq 2000001≤n≤200000)

输出描述:
输出一行一个正整数表示答案。
示例1
输入
复制
6
AABBAA
输出
复制
6
说明
选择”BBAA”的子串,使用魔法变成AABB,则整个字符串变为AAAABB,所以最长不递减子串长度为6。
第一眼不知道怎么写,第二眼还是不知道怎么写。看别人的代码,一下子就知道怎么写了😭。
我们枚举每一个非递减子串在加上他下一个非递减子串的长度。为什么呐
假如AABBAABBBA;
我们第一个非递减子串是AABB,第二个是AAABBB
那么AABBAAABBB中间的BBAAA就是非递增子串,那么就可以将其改为AAABB那么最长的就是10.
每两个非递增的中间肯定是非递减或者没有。

#include <bits/stdc++.h>//思维题得有点智商才可以
using namespace std;
typedef long long ll;
int n,num,ans=0;
string s;
vector<int>a;
int main()
{
    cin>>n>>s;
    for(int i=0;i<n;){
        num=0;
        while(s[i]=='A') i++,num++;
        while(s[i]=='B') i++,num++;
        a.push_back(num);
    }
    a.push_back(0);//存 0 防止数组就一个元素时越界
    for(int i=0;i<a.size()-1;i++) ans=max(ans,a[i]+a[i+1]);
    cout<<ans;
    return 0;
}

🌊

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值