codeforces Minimum number of steps (804 B)

本文解析了CodeForces上的一道题目,该题要求计算字符串中特定转换发生的次数。通过观察规律,发现每次遇到'b'字符时,可根据其前'a'字符数量计算变化次数。文章提供了使用快速幂优化计算过程的C++代码。

题目链接:

http://codeforces.com/contest/804/problem/B

题意:

给你一串字符串,里面只含有‘a’和‘b’两种字母,其中,一旦遇到‘ab’这种情况时需要将其变换为‘bba’。问你,最后整个字符串都无法变化时一共变化了几次。

题解:

其实这道题目可以算是一道规律题。
ab时答案为1
aab时答案为3
aaba时答案为3
aabab时答案为10
从上面的案例我们可以很快的推断出,每一次遇到b时,我们只要知道这个b之前一共出现了几个a,然后就可以根据a的数量(cnt)计算:2^cnt-1。
然后累加就行了。这里因为数据的范围比较大,用快速幂。自己比较蛇皮的最后答案没有mod,结果wa了一发。。。。。。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 1e6+10;
const int mod = 1e9+7;
char s[maxn];
__int64 num[maxn];

__int64 fast_mi(__int64 a,__int64 k)
{
    __int64 res=1;
    while(k)
    {
        if(k&1)
            res=res*a%mod;
        a=a*a%mod;
        k>>=1;
    }
    return res;
}

int main()
{
    scanf("%s",s);
    int len=strlen(s);
    met(num,0);
    __int64 cnt=0;
    for(int i=0;i<len;i++)
    {
        if(s[i]=='a')
            cnt++;
        else if(s[i]=='b')
            num[i]=cnt;
    }
    __int64 ans=0;
    for(int i=0;i<len;i++)
    {
        if(s[i]=='b')
            ans=(ans+fast_mi(2,num[i])-1)%mod;
    }
    printf("%I64d\n",ans);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值