【推导】Codeforces Round #411 (Div. 1) B. Minimum number of steps

最后肯定是bbbb...aaaa...这样。

你每进行一系列替换操作,相当于把一个a移动到右侧。

会增加一些b的数量……然后你统计一下就行。式子很简单。

喵喵喵,我分段统计的,用了等比数列……感觉智障。一个a一个a地统计答案即可。

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define MOD 1000000007ll
typedef long long ll;
ll Quick_Pow(ll a,ll p)
{
    if(!p) return 1;
    ll ans=Quick_Pow(a,p>>1);
    ans=ans*ans%MOD;
    if((p&1)==1) ans=(ans*(a%MOD))%MOD;
    return ans;
}
ll ans;
char s[1000010];
int lastb,n;
int main(){
//	freopen("b.in","r",stdin);
	scanf("%s",s+1);
	n=strlen(s+1);
	for(int i=n;i>=1;--i){
		if(s[i]=='b'){
			lastb=i;
			break;
		}
	}
	ll a1=0;
	for(int i=lastb;i>=1;){
		int j;
		for(j=i;j>=1;--j){
			if(j==1 && s[j]=='b'){
				cout<<ans<<endl;
				return 0;
			}
			else if(s[j]=='a'){
				break;
			}
		}
		for(int k=j;k>=1;--k){
			if(k==1&&s[k]=='a' || s[k-1]=='b'){
				a1=(a1+(ll)(i-j))%MOD;
				ans=(ans+(a1*(Quick_Pow(2ll,(ll)(j-k+1))-1ll+MOD)%MOD)%MOD)%MOD;
				a1=(a1*Quick_Pow(2ll,(ll)(j-k+1)))%MOD;
				i=k-1;
				break;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/autsky-jadek/p/6815498.html