Codeforces Round #411 (Div. 2) D. Minimum number of steps

题目链接:Minimum number of steps


题目大意:给你一段字符串,只包含a,b两种字符,如果碰到ab,就将它变为bba,问这样的变换需要几次


题目思路:我的做法比较不清真,但是能AC。统计每个b左边的a有多少个,然后就是从2的0次方加到2的n-1次方,每个b的贡献是这么多,把所有b的贡献累加,就可以了,算贡献的时候预处理一下2的多少次方,然后预处理一下从2的0次方加到2的n-1次方的总和是多少,每次都对1e9+7取模就好了

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

string a;
const ll MOD = 1e9+7;
int cal[1000005],ss[1000005];

int main(){
    ios::sync_with_stdio(false);
    cal[0] = 1;
    for(int i = 1;i < 1000005;i++)
        cal[i] = (cal[i-1]*2)%MOD;
    ss[0] = 1;
    for(int i = 1;i < 1000005;i++)
        ss[i] = (ss[i-1]+cal[i])%MOD;
    cin>>a;
    ll l = a.size();
    ll ans = -1;
    ll sum = 0;
    for(ll i = 0;i < l;i++){
        if(a[i] == 'a') ans++;
        if(a[i] == 'b'&&ans >= 0) sum = (sum+ss[ans])%MOD;
    }
    printf("%lld\n",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值