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. WPF 已知问题 清空 CollectionView 的 SortDescriptions 可能抛出空异常

    本文记录一个 WPF 的已知问题,在通过 CollectionViewSource 获取到 CollectionView 之后,如果 CollectionViewSource 对象已被 GC 回收,将 ...

  2. 还在用Jenkins?快来试试这款比Jenkins简而轻的自动部署软件!

    大家好,我是 Java陈序员. 在工作中,你是否遇到过团队中没有专业的运维,开发还要做运维的活,需要自己手动构建.部署项目? 不同的项目还有不同的部署命令,需要使用 SSH 工具连接远程服务器和使用 ...

  3. python 简明笔记

    python 简明笔记 基础内置类型 数值类型 字面量 3.14e-10 3.14E-10 3.14e+10 #八进制 0o123 #十六进制 0xabf #二进制 0b10101 #进制转换函数 # ...

  4. 安装XMind如何安装到指定目录

    在Win10系统上安装XMind,发现安装完成之后,XMind被安装到了C盘.由于C盘是系统盘,这让人很不爽.XMind在安装过程中也没有提供安装路径选择,而是点击安装程序之后,就一路开始安装到C盘. ...

  5. fastposter v2.8.1 发布 电商海报生成器

    fastposter v2.8.1 发布 电商海报生成器 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发.二维码海报,图片海报,分享海报,二维 ...

  6. cesium教程9-加载倾斜摄影并解决高度问题

    无人机航拍的倾斜摄影,用照片和视频处理生成三维模型,一般照片都带有坐标信息,所以一般都能定位的比较准确,但是经常会出现高度偏差,这个时候就需要特殊处理了. 今天航拍建模的效果如下: 这个建模没有裁剪, ...

  7. pageoffice6提取word指定位置(数据区域)的值

    在实际的开发过程中,经常会遇到提取Word文档中指定位置的数据保存到数据库中的需求,PageOffice客户端控件即支持在线保存Word文件,也支持Word文档中的指定位置的数据或所有的数据提交到服务 ...

  8. 一次nginx文件打开数的问题排查处理

    现象:nginx域名配置合并之后,发现consul-template无法完成nginx重载,然后发现需要重启nginx,才能让配置生效. 注意:下次哪个服务有报错,就看重启时所有日志输出,各种情况日志 ...

  9. mongodb单个服务部署

    mongodb3.2.8安装步骤: 1.系统准备 (1)redhat或cnetos6.2以上系统 (2)系统开发包完整 (3)ip地址和hosts文件解析正常 (4)iptables防火墙&S ...

  10. 创建一个flutter项目

    启动Android  Studio,点击[Start a new Flutter project] 如果没有这项选项,请先安装Flutter插件 具体安装方法,可参考  flutter开发环境的搭建 ...