ARC 170_A 题解
AT_arc170_a [ARC170A] Yet Another AB Problem 题解
这道题做了我七天
(同时也是我第一到通过的 ARC 题)
太酷了
其实还是比较好理解的
原题题干
输出 \(-1\) 的情况:
- 在第一个更换的 \(B~A\) (即 \(S_i\) 位)之前有 \(A~B\) (即 \(S_j\) 位)的更换
- 在最后更换的 \(A~B\) (即 \(S_j\) 位)之后有 \(B~A\) (即 \(S_i\) 位)的更换
- 在 \(S_1\) 与 \(S_2\)不相等的情况下,无 \(S_i\) 或无 \(S_j\)
核心思路
if(s1[i]=='B'&&s2[i]=='A'){
suma++;//B~A的个数
}
if(s1[i]=='A'&&s2[i]=='B'){
if(suma==0){
ans++;//若A~B的个数已归零,则ans直接加(与之前的A~A换)
}
else{
suma--;//否则顺便换一个B~A
ans++;
}
}
未归零的 \(A~B\) 的个数则和后面的 \(B~B\) 换;
即 \(ans\) 加未归零的 \(A~B\) ( \(suma\) )的个数
cout<<ans+suma;
另一个问题是怎样找 \(S_i\) 及 \(S_j\) 的可操作区间
我的做法是
l=-1,r=-1; //方便检测是否有Si和Sj
for(int i=0;i<n;i++){
if(s2[i]=='A'){ \\找A~A或B~A
l=i;
break;
}
if(s1[i]=='A'&&s2[i]=='B'){ //即第一种情况在第一个更换的B~A(即Si位)之前有A~B(即Sj位)的更换
cout<<"-1";
return 0;
}
}
if(l==-1){ //第三种情况无Si
cout<<"-1";
return 0;
}
for(int i=n-1;i>l;i--){
if(s2[i]=='B'){ //找B~B或A~B
r=i;
break;
}
if(s1[i]=='B'&&s2[i]=='A'){ //即第二种情况在最后更换的A~B(即Sj位)之后有B~A(即Si位)的更换
cout<<"-1";
return 0;
}
}
if(r==-1){ //第三种情况无Sj
cout<<"-1";
return 0;
}
找出可以进行的“安全区间”进行操作
此为主代码(仅供参考)
#include<bits/stdc++.h> //万能头万岁。。。
#define seq(q,w,e) for(int q=w;q<=e;q++)
#define ll long long
using namespace std;
string s1,s2;
int n,ans,suma,l,r;
int main(){
scanf("%d",&n);
cin>>s1>>s2; //输入字符串
if(s1==s2){ //判断是否相等
cout<<"0";
return 0;
}
l=-1,r=-1;
for(int i=0;i<n;i++){
if(s2[i]=='A'){ \\找A~A或B~A
l=i;
break;
}
if(s1[i]=='A'&&s2[i]=='B'){ //即第一种情况在第一个更换的B~A(即Si位)之前有A~B(即Sj位)的更换
cout<<"-1";
return 0;
}
}
if(l==-1){
cout<<"-1"; //第三种情况无Si
return 0;
}
for(int i=n-1;i>l;i--){
if(s2[i]=='B'){ //找B~B或A~B
r=i;
break;
}
if(s1[i]=='B'&&s2[i]=='A'){ //即第二种情况在最后更换的A~B(即Sj位)之后有B~A(即Si位)的更换
cout<<"-1";
return 0;
}
}
if(r==-1){ //第三种情况无Sj
cout<<"-1";
return 0;
}
seq(i,l,r){ //循环找更换次数
if(s1[i]=='B'&&s2[i]=='A'){
suma++;
}
if(s1[i]=='A'&&s2[i]=='B'){
if(suma==0){
ans++;
}
else{
suma--;
ans++;
}
}
}
cout<<ans+suma; //若若B~A的个数已归零,则ans直接加剩余的A~B的个数(与之后的B~B换)
return 0;
}
本蒟蒻第一次发题解,不好之处见谅 (汗)
ARC 170_A 题解的更多相关文章
- ARC 122 简要题解
ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...
- 【题解】Atcoder ARC#96 F-Sweet Alchemy
首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...
- 【题解】Atcoder ARC#94 F-Normalization
再次膜拜此强题!神级性质之不可能发现系列收藏++:首先,对于长度<=3的情况,我们采取爆搜答案(代码当中是打表).对于长度>=4的情况,则有如下几条玄妙的性质: 首先我们将 a, b, c ...
- [题解] Atcoder Regular Contest ARC 148 A B C E 题解
点我看题 题目质量一言难尽(至少对我来说 所以我不写D的题解了 A - mod M 发现如果把M选成2,就可以把答案压到至多2.所以答案只能是1或2,只要判断答案能不能是1即可.如果答案是1,那么M必 ...
- [题解] Atcoder Regular Contest ARC 147 A B C D E 题解
点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...
- [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP
题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...
- [题解] Atcoder Regular Contest ARC 151 A B C D E 题解
点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\) ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- 【题解】Atcoder ARC#67 F-Yakiniku Restaurants
觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...
- 【题解】Atcoder ARC#85 E-MUL
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...
随机推荐
- WPF 对接 Vortice 绘制 WIC 图片
本文告诉大家如何通过 Vortice 在 Direct2D 里面绘制图片,图片的来源是 WIC 加载出的图片 在上一篇博客 WPF 对接 Vortice 调用 WIC 加载图片 告诉了大家如何对接 V ...
- 【python爬虫案例】用python爬豆瓣音乐TOP250排行榜!
目录 一.爬虫对象-豆瓣音乐TOP250 二.python爬虫代码讲解 三.同步视频 四.获取完整源码 一.爬虫对象-豆瓣音乐TOP250 今天我们分享一期python爬虫案例讲解.爬取对象是,豆瓣音 ...
- 04 Xpath_[实例]爬取maoyan
目录 Xpath lxml库的安装和使用 提取的内容 代码 生成的csv 下载的图片 参考文档 Xpath lxml库的安装和使用 提取的内容 随意选取的一段 节点包含的影片信息,如下所示: < ...
- ansible(6)--ansible的copy和fetch模块
1. copy模块 功能:从 ansible 服务端主控端复制文件到远程主机: copy模块的主要参数如下: 参数 说明 src 复制的源文件路径,若源文件为目录,默认进行递归复制,如果路劲以&quo ...
- IDEA文件夹注释插件TreeInfotip使用
目录 前景提要 环境整合 构建工具(参考工具部署方式) 下载插件 使用 前景提要 很多开源代码或者公司代码,因为层级比较多,所以查阅困难,发现一个TreeInfotip插件可以对这样的文件做注释 环境 ...
- AIRIOT答疑第5期|如何使用低代码业务流引擎?
推拉拽! AIRIOT平台业务流引擎可创建丰富的业务流程,实现从流程定义.数据处理.任务工单.消息通知.日志追踪的闭环流转.多类型节点任意组合,可视化流程日志,精准追踪流程流转.人工任务统一管理,审批 ...
- c# 记一次批量获取自己的qq好友的CF游戏战绩
突然想耍穿越火线,就下载了,想看看自己的战绩就在这个网址上查:https://cf.qq.com/wx/zjcx.htm,后来又想看看qq好友的战绩,就得一个一个得复制粘贴qq,选择大区.我这时候就像 ...
- Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案
原文首发链接:Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好,我是码农先森. 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的,它是一种点对点的通信技术,通过浏 ...
- Linux运维面试总结
1.Linux系统相关日志 /var/log/message:系统信息日志,包含错误信息 /var/log/secure:系统登录日志 /var/log/maillog:邮件日志 /var/log/c ...
- NET框架下如何使用PaddleOCRSharp
打开VSIDE,新建Windows窗体应用(.NET Framework)类型的项目,选择一个.NET框架,如.NET Framework 4.0,右键点击项目,选择属性>生成,目标平台设置成X ...