Codeforces Round #411 div 2 D. Minimum number of steps

D. Minimum number of steps

time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
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".
 
解题思路:
题意是输入一个字符串,将其中的ab改为bba,问需要变换多少次才能让字符串中没有ab
由题可知,ab判断两种情况: 1.ab前面有a时的变化, 2.ab后面有b时的变化;
具体解析放在代码中解释
 
实现代码:
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
char str[1000005];
int main(){
    int n,total,a;
    scanf("%s",str);
        total = a = 0;
        int len = strlen(str);
        for(int i = 0;i < len;i++){
            if(str[i] == 'a'){   //由于只有a,b两个字母,只需判断是否为a
                a = (2 * a + 1) % mod;  //由于数据太大,只能一步一步取模,若将b前面的a个数加起来用2^n-1公式求值,数字会由于太大,变成负数
            }else{
                total = (total + a) % mod; //公式可自行推演,多推一下,很容易得出
            }
        }
        printf("%d
",total);
    return 0;
}
原文地址:https://www.cnblogs.com/kls123/p/6814655.html