E - Nikita and string 暴力 + 前缀和

传送门
题意:给你一个字符串,问你能否将它们按照第一部分为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;
}


发布了244 篇原创文章 · 获赞 8 · 访问量 5124

猜你喜欢

转载自blog.csdn.net/weixin_43960370/article/details/102994549