牛客子序列(结论题)
链接:https://ac.nowcoder.com/acm/contest/11233/B
来源:牛客网
给出一个仅包含 a,b 的字符串 A。在 A 中间任意位置(包括开头结尾)插入一个字符,最大化 aab 作为子序列(可以不连续)在 A 中出现的次数。
输入描述:
第一行一个仅包含 a,b 的字符串 A。
输出描述:
输出一个整数,为插入一个字符后,aab 作为子序列在 A 中出现的次数的最大值。
备注:
对于 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; }

浙公网安备 33010602011771号