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

被折叠的 条评论
为什么被折叠?



