题意:
给出一个只含 a b 字符的串,问不断将串中的 “ab” 字串替换为 “bba” 至少需要几次可以结束替换,结果对 1e9 + 7 取余。
思路:
首先,替换的顺序并不影响最终替换的次数。
我们从空串开始模拟添加,可以发现规律,每加入一个 ‘b’ ,设 ‘b’ 之前 ‘a’ 的个数为 x ,替换次数就加上 2^x -1。
例子: ab 1
aab 3
abab 4 = 1 + 3
ababab 11 = 1 + 3 + 7
由此将整个串扫一遍即可。
代码:
#include <bits/stdc++.h> using namespace std; const int MOD=1e9+7; const int MAXN=1e6+100; long long m[MAXN]; int main() { m[0]=1; for(int i=1;i<MAXN-1;i++) m[i]=(m[i-1]*2)%MOD; for(int i=0;i<MAXN-1;i++) m[i]--; string str; while(cin>>str){ int n=str.size(); int cut=0; long long ans=0; for(int i=0;i<n;i++){ if(str[i]=='a'){ cut++; }else{ ans+=m[cut]; ans%=MOD; } } cout<<ans<<endl; } }