AT_arc170_a [ARC170A] Yet Another AB Problem 题解

这道题做了我七天

(同时也是我第一到通过的 ARC 题)

太酷了

其实还是比较好理解的

原题题干

原题题干(洛谷)

输出 \(-1\) 的情况:

  1. 在第一个更换的 \(B~A\) (即 \(S_i\) 位)之前有 \(A~B\) (即 \(S_j\) 位)的更换
  2. 在最后更换的 \(A~B\) (即 \(S_j\) 位)之后有 \(B~A\) (即 \(S_i\) 位)的更换
  3. 在 \(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 题解的更多相关文章

  1. ARC 122 简要题解

    ARC 122 简要题解 传送门 A - Many Formulae 考虑对于每个数分别算其贡献. 通过枚举该数前面的符号,借助一个非常简单的 \(\mathrm{DP}\)(\(f_{i,0/1}\ ...

  2. 【题解】Atcoder ARC#96 F-Sweet Alchemy

    首先,我们发现每一个节点所选择的次数不好直接算,因为要求一个节点被选择的次数大于等于父亲被选择的次数,且又要小于等于父亲被选择的次数 \(+D\).既然如此,考虑一棵差分的树,规定每一个节点被选择的次 ...

  3. 【题解】Atcoder ARC#94 F-Normalization

    再次膜拜此强题!神级性质之不可能发现系列收藏++:首先,对于长度<=3的情况,我们采取爆搜答案(代码当中是打表).对于长度>=4的情况,则有如下几条玄妙的性质: 首先我们将 a, b, c ...

  4. [题解] Atcoder Regular Contest ARC 148 A B C E 题解

    点我看题 题目质量一言难尽(至少对我来说 所以我不写D的题解了 A - mod M 发现如果把M选成2,就可以把答案压到至多2.所以答案只能是1或2,只要判断答案能不能是1即可.如果答案是1,那么M必 ...

  5. [题解] Atcoder Regular Contest ARC 147 A B C D E 题解

    点我看题 A - Max Mod Min 非常诈骗.一开始以为要观察什么神奇的性质,后来发现直接模拟就行了.可以证明总操作次数是\(O(nlog a_i)\)的.具体就是,每次操作都会有一个数a被b取 ...

  6. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  7. [题解] Atcoder Regular Contest ARC 151 A B C D E 题解

    点我看题 昨天刚打的ARC,题目质量还是不错的. A - Equal Hamming Distances 对于一个位置i,如果\(S_i=T_i\),那么不管\(U\)的这个位置填什么,对到\(S\) ...

  8. 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)

    题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...

  9. 【题解】Atcoder ARC#67 F-Yakiniku Restaurants

    觉得我的解法好简单,好优美啊QAQ 首先想想暴力怎么办.暴力的话,我们就枚举左右端点,然后显然每张购物券都取最大的值.这样的复杂度是 \(O(n ^{2} m)\) 的.但是这样明显能够感觉到我们重复 ...

  10. 【题解】Atcoder ARC#85 E-MUL

    ……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...

随机推荐

  1. JavaScript之变量解构赋值的使用

    引言 解构赋值是ES6中引入的一种能快速方便的进行变量赋值的方法,其主要也就是分为解构和赋值两部分内容.解构者,也就是匹配结构,然后分解结构进行赋值. 数组的解构赋值 使用 const arr = [ ...

  2. MQTT GUI 客户端 可视化管理工具

    MQTT GUI 客户端 可视化管理工具 介绍 多标签页管理,同时打开多个连接 提供原生性能,并且比使用 Electron 等 Web 技术开发的同等应用程序消耗的资源少得多 支持 MQTT v5.0 ...

  3. 259k+ Star!这是我见过最全的开发者技术学习路线!

    大家好,我是 Java陈序员. 自从上班后,身体是一天不如一天了,也很少有时间可以去学习新技术了.程序员如果技术跟不上,很容易就被淘汰. 而碎片化的学习效率又不高,往往今天学了,明天就忘了.有时候更是 ...

  4. 详解csrf(跨站请求伪造)

    1.什么是csrf (csrf攻击原理)? 用户正常访问A网站,A网站设置cookie被用户浏览器保存 用户不关闭浏览器,直接访问恶意网站,该恶意网站内隐藏式内嵌了A网站接口的请求链接 触发该请求链接 ...

  5. 11.17~11.18暨noip2023游寄

    11.17 我们DZ不负众望又干了点nt事,但是为了按时间顺序记叙,所以说放到最后再讲 上午 平常的起床+吃饭,然后就发手机啥的,坐大巴去德州东再坐会高铁去秦皇岛,这些简单记一下就行了 重点来了 先拜 ...

  6. go实现发送邮件验证码

    目录 开启SMTP服务: 发邮件测试 业务实现 开启SMTP服务: QQ邮箱参考下面连接: QQ邮箱如何开通SMTP服务 https://jingyan.baidu.com/article/00a07 ...

  7. ip地址、子网掩码、网关、dns简介

    IP地址IPADDR: IP地址是唯一的标识,是一段网络编码(二进制),由32位组成. IP 是 Internet Protocol(网际互连协议)的缩写,是 TCP/IP 体系中的网络层协议. IP ...

  8. MyBatis-Plus 实现多租户管理的实践

    本文主要讲解使用Mybatis-Plus结合dynamic-datasource来实现多租户管理 在现代企业应用中,多租户(Multi-Tenant)架构已经成为一个非常重要的设计模式.多租户架构允许 ...

  9. 预见预判_AIRIOT智慧交通管理解决方案

    随着机动车保有量的逐步增加,城市交通压力日益增大.同时,新能源车辆的快速发展虽然带来了环保效益,但也因不限号政策而进一步加剧了道路拥堵问题.此外,各类赛事和重大活动的交通管制措施也时常导致交通状况复杂 ...

  10. 保姆教程系列:Git 实用命令详解

    !!!是的没错,胖友们,保姆教程系列又更新了!!! @ 目录 前言 1.将本地项目推送到远程仓库 2. Idea Git回退到某个历史版本 3. 修改项目关联远程地址方法 4. Git 修改分支的名称 ...