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 @ 2023-12-01 11:45  UncleSam_Died  阅读(29)  评论(0)    收藏  举报  来源