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();
}

浙公网安备 33010602011771号