传送门
题意:给你一个字符串,问你能否将它们按照第一部分为a,第二部分为b,第三部分为a 化成三个部份。其中这三个部分可以为空,也就是说单独的aaa,bbb都可以。
思路:我们可以做一下a的前缀和 和 后缀和, 然后再O(n^2)枚举b的区间,不断维护一个最大值。
/**
* From:
* Qingdao Agricultural University
* Created by XiangwangAcmer
* Date : 2019-11-09-13.14.48
* Talk is cheap.Show me your code.
*/
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
using namespace std;
const ll maxn = 1e6 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
const long long LIMIT = 4294967295LL;
vector<int>v[maxn];
int dp[maxn];
vector<int>G[maxn];
bool row[maxn], col[maxn];
bool flag = 0;
queue<int>q;
int n;
string a;
int pre[maxn], lre[maxn];
int main()
{
ios::sync_with_stdio(false);
int maxnn = 0;
cin >> a;
int flag1 = 0, flag2 = 0;
if(a[0] == 'a')
{
pre[0] = 1;
flag1 = 1;
}
if(a[0] == 'b')
flag2 = 1;
for(int i = 1; i < a.size(); i++)
{
pre[i] = pre[i - 1];
if(a[i] == 'b')
flag2 = 1;
if(a[i] == 'a')
{
pre[i]++;
flag1 = 1;
}
}
if(!flag1)
{
cout << a.size() << endl;
return 0;
}
if(!flag2)
{
cout << a.size() << endl;
return 0;
}
for(int i = a.size() - 1; i >= 0; i--)
{
lre[i] = lre[i + 1];
if(a[i] == 'a')
{
lre[i]++;
}
}
for(int i = 0; i < a.size(); i++)
{
if(a[i] == 'b')
{
int cnt = 1;
maxnn = max(pre[i] + lre[i] + cnt, maxnn);
for(int j = i + 1; j < a.size(); j++)
{
if(a[j] == 'b')
{
cnt++;
}
maxnn = max(pre[i] + lre[j] + cnt, maxnn);
}
}
maxnn = max(pre[i] + lre[i]-1 , maxnn);
}
cout << maxnn << endl;
return 0;
}