嗯...
题目链接:https://www.luogu.org/problemnew/show/CF804B
这道题没有什么技巧,只是一道找规律的题。
首先看到“ab”可以换成“bba”,所以首先要确定我们要逆序枚举(注意s从s_0开始),如果遇到a,则把ans += cntb,因为可以换的次数即为a后面b的个数,然后把cntb的个数乘二,因为一个ab可以换bba,也就一个b换两个b。如果遇到b,则直接cntb++即可,不需要别的操作。
注:mod可以随时模,不会影响最后结果。
AC代码:
1 #include2 #include 3 #include 4 5 using namespace std; 6 7 const int mod = 1e9 + 7; 8 char s[1000005]; 9 long long ans, cntb;10 11 int main(){12 scanf("%s", s);13 int len = strlen(s);14 for(int i = len - 1; i >= 0; i--){15 if(s[i] == 'a'){16 (ans += cntb) %= mod;17 (cntb *= 2) %= mod;18 }19 else cntb++;20 }21 printf("%lld\n", ans % mod);22 return 0;23 }