https://www.cnblogs.com/yoke/p/6904472.html
题意: 输入一个只包含'a', 'b'的字符串,将该字符串中的"ab"换成"bba",直到字符串中不出现"ab",问最少需要多少步。
思路:
要想不出现"ab",则字符串中所有的a字符都在b字符的右边,所以要做的就是把所有的a字符向右移动
ab--->bba可以看作是把a和b调换位置然后b的数量增加两倍
所以ab--->bba 需要1步 abb--->bbbba 需要2步 .......
所以我们可以在字符串中从后往前判断a字符后面有多少个b字符,然后根据上面找到的规律判断步数即可。
从后往前遍历,遇到b则k++,遇到a则统计答案,然后将k乘2(2k个b调到此a的前面,变成了前面的a的后面的2k个b,k*2供前面的a继续计数用)
#include<bits/stdc++.h>
using namespace std;
const int MOD=1e9+7;
int main(){
string s;
cin>>s;
int ans=0,k=0;
int len=s.size();
for(int i=len-1;i>=0;--i){
if(s[i]=='b') ++k;
else {ans=(ans+k)%MOD,k=k*2%MOD;}
}
cout<<ans<<endl;
return 0;
}
加法加上乘法,加法乘法都可各自独立取模