CF-794补题

D题(一整个没想法,那就看题解吧!)

 

 

 

 

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

void test_case()
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    string s;
    cin >> s;

    int cntA = count(s.begin(), s.end(), 'A');
    if (cntA != c + d + a)
    {
        cout << "NO\n";
        return;
    }

    int baseline = 0;
    vector<int> favA, favB;
    int n = s.size();
    for (int i = 0; i < n; i++)
    {
        int j = i;
        while (j < n && (s[j] != s[i]) == ((j - i) & 1)) ++j;

        int len = j - i;
        if (len == 1)//连续两个字母相同
        {
            continue;
        }

        baseline += (len - 1)/2;//ABAB baseline+1;  ABABA baseline+2;
        if (len % 2 == 0)
        {
            if (s[i] == 'A')
                favA.push_back(len/2);
            else
                favB.push_back(len/2);
        }

        i = j - 1;
    }

    sort(favA.begin(), favA.end());
    sort(favB.begin(), favB.end());

    for (int i : favA)
    {
        if (i > c) break;
        baseline -= (i - 1);
        c -= i;
    }

    for (int i : favB)
    {
        if (i > d) break;
        baseline -= (i - 1);
        d -= i;
    }

    cout << (baseline >= (c + d) ? "YES" : "NO") << endl;
}

int main()
{
    int tests;
    cin >> tests;
    while (tests--)
    {
        test_case();
    }
    return 0;
}

 

posted @ 2022-05-27 15:26  好腻友Π  阅读(27)  评论(0)    收藏  举报