Title

CF1896B AB Flipping 题解

解题思路

很简单的一道题,因为每个 A 只能向后移,每个 B 只能向前移,所以很容易想到,对于每一段连续的 A,直接往后移就是答案。但是因为每个坐标只能选择一次,那么,我们考虑用栈来维护这一过程:

  • 如果当前位置上是 A 那么直接入栈;
  • 如果当前位置上是 B 那么 ans=ans+tail,其中 tail 表示当前栈中的元素的个数,同时,我们把 tail 重置为 min(tail,1),从而避免有下标被重复选择,而之所以取 min 是因为在栈为空时不会有任何值的变化。

AC 代码

#include<math.h>
#include<time.h>
#include<stdio.h>
#include<algorithm>
#define ll long long
#define N 200005
int n;char s[N];
inline void work(){
    scanf("%d",&n);
    scanf("%s",s);
    int ans=0,tail=0;
    for(register int i=0;i<n;++i){
        if(s[i]=='B'){
            ans+=tail;
            tail=std::min(tail,1); 
        }else tail++;
    }printf("%d\n",ans);
}signed main(){
    int T;scanf("%d",&T);
    while(T--) work();
}
posted @   UncleSam_Died  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示