对于第一组样例: "ab" → "bba".
对于第二组样例: "aab" → "abba" → "bbaba" → "bbbbaa".
推理发现,对于最后的一个ab,替换成bba后,可以发现他后面有a是没用的,有b才有用,有一个b就替换一次。bbab->bbbba了。
这时候你想对于替换前那最后一个ab,他前面如果有a会怎么样呢,a可以消耗掉那最后一个ab替换后得到所有的b而且产生他两倍的b。
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e6+5;
const int mod=1e9+7;
char s[maxn];
int main()
{
while(scanf("%s",s)!=-1)
{
int len=strlen(s);
long long ans=0;
long long anum=0,bnum=0;
long long sum=0;
for(int i=len-1;i>=0;i--)
{
if(s[i]=='b')bnum++;
if(s[i]=='a')
{
anum++;
ans+=bnum%mod;
bnum*=2;
bnum=bnum%mod;
}
}
ans%=mod;
printf("%lld\n",ans);
}
return 0;
}
<br /><span id="_xhe_temp" width="0" height="0"></span>
</div></div></div>