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 @   mgcjade  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示