最后肯定是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; }