CF804B Minimum number of steps 题解
观察最后满足条件的状态(如下),可以发现最后状态一定为前段是连续的 b,后段是连续的 a。
[样例1] [样例2]
ab aab
bba bbbbaa
再观察 ab 和 bba,可以发现变化的实质就是交换 a 和 b 的位置,并将 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;
}

浙公网安备 33010602011771号