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

Minimum number of steps

https://vjudge.net/problem/CodeForces-804B)
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<bits/stdc++.h>
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;
}

这篇转自一位大佬的博客,自己在写的时候b的总数这里没有取模,所以一直在溢出,导致一直WA,这里的取模真的是很妙的一手,那么为什么取模结果不变呢,个人理解是 :sum = (sum % mod + b % mod) % mod这一步中的b % mod如果真的求得话,得到的是余数,而(b % mod * 2) % mod已经是余数了,所以结果是一样的。(来自菜狗的思考)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值