CodeForces - 804B Minimum number of steps(思维)

Minimum number of steps

We have a string of letters 'a' and 'b'. We want to perform some operations on it. On each step we choose one of substrings "ab" in the string and replace it with the string "bba". If we have no "ab" as a substring, our job is done. Print the minimum number of steps we should perform to make our job done modulo 109 + 7.

The string "ab" appears as a substring if there is a letter 'b' right after the letter 'a' somewhere in the string.

Input

The first line contains the initial string consisting of letters 'a' and 'b' only with length from 1 to 106.

Output

Print the minimum number of steps modulo 109 + 7.

Examples

Input

ab

Output

1

Input

aab

Output

3

Note

The first example: "ab"  →  "bba".

The second example: "aab"  →  "abba"  →  "bbaba"  →  "bbbbaa".

 

题意:给你一个只包含 a, b 的字符串, 要求将其中的 "ab", 都变成 "bba",问一直到最后没 "ab"子串,需要变化多少次。

思路:思维题就是思维题,只要发现那一点,代码真的很好写,可是就是发现不了啊。。。QAQ  很显然,这个题时间就给了1000ms, 而且字符串的长度还是 1e6,肯定不可能用模拟来做。所以就开始找规律,这个题只要发现两点,就很容易 A 了,首先,对于每个 "ab",变化后,b 的数量是翻倍的,接着就是,对于每个字符 a  后面后多少个 b ,就需要变化多少次。。最后加起来就是答案了。 我不捞谁捞.jpg..

AC代码:

#include
using namespace std;

const int mod = 1e9 + 7;
int main()
{
    string s;
    while(cin >> s){
        long long b = 0;   ///记录一下 a 后面b 的数量
        long long sum = 0;
        for(int i = s.size() - 1;i >= 0;i --){
            if(s[i] == 'a'){
                sum = (sum % mod + b % mod) % mod;
                b = (b % mod * 2) % mod;
            }
            else if(s[i] == 'b'){
                b ++;
            }
        }
        printf("%I64d\n",sum);
    }
    return 0;
}

 

你可能感兴趣的:(#,codeforces,#,贪心,思维,bao力,模拟)