给你一个只包含a,b两种字母的字符串,如果有一个连续子串为ab.那么就可以将其变成bba.让你计算这个给出的字符串在操作了多少次之后不能再进行操作了。
思路:
最终字符串一定会变成bbbbbbb........aaaa..............
所以前边的a是要累加起来的。
我们观察到ab答案是1
aab答案是3.
aaab答案是7.
那么一个b前边有n个a,那么这个b会贡献2^n-1次操作。
abab答案是4 =1 + 3
那么对应累加前边的a.一旦遇到b就加上2^n-1即可。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
#define ll __int64
#define mod 1000000007
char a[1000800];
ll poww(ll a,ll b)
{
ll tmp=a%mod;
ll ans=1;
ll n=b;
while(n)
{
if(n%2==1)
{
ans=(ans*tmp)%mod;
n-=1;
}
else
{
tmp=(tmp*tmp)%mod;
n/=2;
}
}
return ans;
}
int main()
{
while(~scanf("%s",a))
{
ll cnt=0;
ll output=0;
ll n=strlen(a);
for(ll i=0;i<n;i++)
{
if(a[i]=='b')
{
output=(output+(poww(2,cnt)-1)+mod)%mod;
}
else cnt++;
}
printf("%I64d\n",(output+mod)%mod);
}
}