AT_arc170_a的题解
谨以此片题解纪念我在 ARC 比赛中通过的第一题。
AT_arc170_a 的题解
题目大意
给出两个字符串 S 和 T 以及它们的长度,同时存在一种操作:
- 将 \(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;
}

浙公网安备 33010602011771号