题意:在一个只有a和b两种字符的字符串中,将ab边为bba,问知道不能变化为止最少变多少次
思路:ab-》bba 数量上a没少,b多一个,且a移动到左边了。a每和一个b变换成bba,就相当于将a,b对调,并且右边多出一个b,变成bba后,原串中左端还有一个a,a就会和两个b配对,并多出两个b。
所以可以计算b之前有多少个a,
一个a:ab -> bba
两个a:aab -> ab ba -> bb ab a -> bbbbaa
三个a:aaab -> a abba -> abb aba -> abbbbaa-> bb ab bbaa ->bbbb abbaa -> bbbb bbabaa -> bbbbbbbbaaa
完成操作后a都到右边且数量不变,a的数量numa,进行的操作次数为pow(2,numa)-1
#include<cstdio>
#include<iostream>
#include<string>
#include<cmath>
int mod = 1e9+7;
using namespace std;
int my_pow(int a,int b)//快速幂取模
{
if(b==0)return 1;
long long base=a;
int ans=1;
while(b)
{
if(b&1)
ans=(ans*base)%mod;
base=(base*base)%mod;
b>>=1;
}
ans%=mod;
return ans;
}
int main()
{
string s;
while(cin>>s)
{
int n=s.size();
int a=0;
long long ans=0;
for(int i=0;i<n;i++)
{
if(s[i]!='b')a++;
else
{
int aa=my_pow(2,a);
ans=(ans+aa-1)%mod;
}
}
printf("%I64d\n",ans);
}
}