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

xiaoxiao2021-02-28  137

题目链接: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; }

转载请注明原文地址: https://www.6miu.com/read-33722.html

最新回复(0)