CF804B Minimum number of steps 题解

观察最后满足条件的状态(如下),可以发现最后状态一定为前段是连续的 b,后段是连续的 a

[样例1]     [样例2]
ab          aab
bba         bbbbaa

再观察 abbba,可以发现变化的实质就是交换 ab 的位置,并将 b 的个数增加 \(1\)(乘以 \(2\)

所以从后往前遍历字符串,可以用一个计数器,记录当前字符 a 为了到后段需跨越的 b 的数量。当遇到 b 时,则计数器增加 \(1\);遇到 a 时,则使答案加上计数器,并把计数器乘以 \(2\)

记得取余。

Code

#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
char s[1000005];
int ans,cnt,l;
int main(){
	cin>>s;
	l=strlen(s);
	for(int i=l-1;i>=0;i--){
		if(s[i]=='b'){
			cnt++;
			cnt%=mod;
		}
		else{
			ans+=cnt;
			ans%=mod;
			cnt*=2;
			cnt%=mod;
		}
	}
	cout<<ans%mod;
	return 0;
}
posted @ 2025-08-18 19:08  cqbzcjh  阅读(13)  评论(0)    收藏  举报