CF1896B AB Flipping 题解
解题思路
很简单的一道题,因为每个 A
只能向后移,每个 B
只能向前移,所以很容易想到,对于每一段连续的 A
,直接往后移就是答案。但是因为每个坐标只能选择一次,那么,我们考虑用栈来维护这一过程:
- 如果当前位置上是
A
那么直接入栈; - 如果当前位置上是
B
那么 ,其中 表示当前栈中的元素的个数,同时,我们把 重置为 ,从而避免有下标被重复选择,而之所以取 是因为在栈为空时不会有任何值的变化。
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();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示