题目链接:
http://codeforces.com/contest/805/problem/D
题目大意:
给定一个只包含字母a和字母b的字符串,对于其中每个出现的ab替换为bba,求要至少操作多少次。
题目分析:
ab→bba
abb→bbab→bbbba
abbb→bbabb→bbbbab→bbbbbba
因此,对于ab….b的形式,经过n次变换(n为b的个数)得到b..ba(2*n个b)
ab→bba
aab→abba→bbaba→bbbbaa
aaab→aabba→abbaba→bbababa→bbbbaaba→bbbbabbaa→bbbbbbabaa→bbbbbbbbaaa
因此,对于a…ab的形式,经过2^n-1次变换(n为a的个数)得到b..ba..a(2^n个b,n个a)
因此,从后向前找b比较简单,从后向前计算连续b的个数,一旦碰到a就将b的个数(即为变换次数)计入总变换次数,并将b的个数乘2(经过变换b的个数变为原来的两倍,与前面的a或者b直接接触,若前面是b则继续计数,若前面是a则继续变换)。
#include<iostream>
#include<queue>
#include<stdio.h>
#include<string.h>
#define m 1000000007
#define LL __int64
using namespace std;
char s[1000010];
int main(){
while(scanf("%s",s)!=EOF){
LL ans=0;
int cnta=0,cntb=0;
int t=strlen(s);
for(int i=t-1;i>=0;i--){
if(s[i]=='b'){
cntb++;
}
else {
ans=(ans+cntb)%m;
cntb=cntb*2%m;
}
}
printf("%I64d\n",ans);
}
return 0;
}