牛客IOI周赛26-普及组T2
作者:Feecle6418
链接:https://ac.nowcoder.com/discuss/669017?type=101&order=0&pos=7&page=1&channel=-1&source_id=1
来源:牛客网
结论:最优解要么是最左边插入一个 a,要么是最右边插入一个 b。枚举两种情况,判断即可。具体判断时,记录前面有几个 a,遇到一个 b 就加上 (a 的个数)*(a 的个数-1)/2。
需要开 unsigned long long。
#include<bits/stdc++.h> using namespace std; char a[550000]; long long len; int main(){ cin >> (a + 1); len = strlen(a + 1); long long ans = 0,sum = 0,maxn = 0,ct = 0; a[0] = 'a'; a[len + 1] = 'b'; for(int i = 0;i <= len;i++){ if(a[i] == 'a') ans++; else if(a[i] == 'b') sum += (ans - 1) * ans / 2; } for(int i = 1;i <= len + 1;i++){ if(a[i] == 'a') ct++; if(a[i] == 'b') maxn += (ct - 1) * ct / 2; } cout << max(maxn,sum) << endl; return 0; }