牛客子序列(结论题)

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

给出一个仅包含 a,b 的字符串 A。在 A 中间任意位置(包括开头结尾)插入一个字符,最大化 aab 作为子序列(可以不连续)在 A 中出现的次数。

输入描述:

第一行一个仅包含 a,b 的字符串 A。

输出描述:

输出一个整数,为插入一个字符后,aab 作为子序列在 A 中出现的次数的最大值。
示例1

输入

复制
abababa

输出

复制
10

说明

在第一个字符后插入一个 a,变为 aabababa。
示例2

输入

复制
ababbaababa

输出

复制
33
示例3

输入

复制
aa

输出

复制
1

备注:

对于 100% 的数据, 1≤n≤5.5×1e6
这是一个结论题:
结论:最优解要么是最左边插入一个 a,要么是最右边插入一个 b。枚举两种情况,判断即可。
具体判断时,记录前面有几个 a,遇到一个 b 就加上 (a 的个数)*(a 的个数-1)/2。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e6+100;
typedef unsigned long long ll;
string s;
ll check(string s){
    int n=s.size();
    ll ans=0,a=0,b=0;
    for(int i=0;i<n;i++){
        if(s[i]=='b'){
            ans+=(a*(a-1))/2;
        }
        else{
            a++;
        }
    }
    return ans;
}
int main(){
    cin>>s;
    cout<<max(check('a'+s),check(s+'b'))<<endl;
    
}

 

 

 
posted @ 2021-06-06 13:35  lipu123  阅读(124)  评论(0)    收藏  举报