window.cnblogsConfig = {//可以放多张照片,应该是在每一个博文上面的图片,如果是多张的话,那么就随机换的。 homeTopImg: [ "https://i.loli.net/2019/08/02/5d440029af8e994539.png" ], }

AT_arc170_a的题解

谨以此片题解纪念我在 ARC 比赛中通过的第一题。

AT_arc170_a 的题解

题目大意

给出两个字符串 ST 以及它们的长度,同时存在一种操作:

  • \(s_i\) 变为 A 并将 \(s_j\) 变为 B,此处 \(1 \leq i<j \leq n\)

让你求出在最少多少次后,字符串 S 能等于字符串 T,如果不能达到目标,就输出 -1

思考过程

一看到题,就感觉是贪心,于是打了一个贪心,然后挂了。

于是把样例抄到草稿纸上,寻找规律(自我以为是图论,因为上一场第一题就是图论),什么都没有发现,发现好像就是单纯的字符串,结果就发现:

  • 对于一个 \(a_i\)\(a_j\),如果它需要进行操作,而没有人可以跟他进行操作,那么此情况无解。

  • 对于一个 \(a_j\),如果它前面由一个需要进行操作的 \(a_i\),那么两个数匹配,否则这个数个前面的某个已经匹配好的数匹配。

  • 对于一个 \(a_i\),如果它后面由一个需要进行操作的 \(a_j\),那么两个数匹配,否则这个数个后面的某个已经匹配好的数匹配。

正解

前后遍历一遍,求出所需的最小 ans,取较小值。

Code

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

const int N = 2e5 + 5;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;

int len;
char s[N], t[N];
queue<int>q;
bool flag;
int ansa, ansb;

int main()
{
    scanf("%d", &len);
    scanf("%s", s + 1);
    scanf("%s", t + 1);

    for (int i = 1; i <= len; i++)
        if (s[i] == 'B' && t[i] == 'A')
            q.push(i), flag = 1;
        else if (s[i] == 'A' && t[i] == 'A')
            flag = 1;
        else if (s[i] == 'A' && t[i] == 'B')
        {
            if (q.size() == 0)
            {
                if (!flag)
                {
                    printf("-1");
                    return 0;
                }
            }
            else
            {
                q.pop();
            }

            ansa++;
        }

    flag = 0;
    ansa += q.size();

    while (!q.empty())
        q.pop();

    for (int i = len; i; i--)
        if (s[i] == 'A' && t[i] == 'B')
            q.push(i), flag = 1;
        else if (s[i] == 'B' && t[i] == 'B')
            flag = 1;
        else if (s[i] == 'B' && t[i] == 'A')
        {
            if (q.size() == 0)
            {
                if (!flag)
                {
                    printf("-1");
                    return 0;
                }
            }
            else
            {
                q.pop();
            }

            ansb++;
        }

    ansb += q.size();

    printf("%d", min(ansa, ansb));
    return 0;
}
posted @ 2024-01-22 07:53  mgcjade  阅读(35)  评论(0)    收藏  举报