链接: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;
}
🌊