首先我们得记下有多少个Jay然后记下J、a、y的个数,当然怎么记都可以,别超时就行,然后直接讨论情况就可以了。
首先如果jay没有连续出现过,那么直接输出出现次数最小的那个字母即可,因为能不能换碎片得看最小的那个,木桶原理都懂吧,这取决于下限。
如果说,整个字符串都是jay的话,我们因该拿出一个jay来,即:2的(jay连续出现次数-1)次方。
最后一种情况,就是有连续的也有不连续的,答案为出现次数最少的那个字符*jay连续出现次数即刻,因为我们得把不连续的先兑换了,最后直接×2的n次方(n为jay出现的连续次数)。
题目本身其实并不难,就看你眼睛好不好使(题目在最下面说明了对结果取余,然后字符串长度为10的八次方,容易让人想到用快速幂处理,我眼睛瞎,没看到对结果取余,所以疯狂WA)。
#include <iostream>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
const long long mod=1e9+7;
using namespace std;
typedef long long LL;
long long kuaisumi(long long a,long long b)
{
a%=mod;
long long sum=1;
do
{
if(b&1)
{
sum=(sum*a)%mod;
}
//位运算效率更高
a=(a%mod*a%mod)%mod;
b>>=1;
}while(b);
return sum;
}
char a[100000500];
int main()
{
scanf("%s",a);
int l=strlen(a);
int i;
long long j[4]={0};
long long tem;
long long min=100000000;
for(i=0;i<l;i++)
if(a[i]=='J'&&a[i+1]=='a'&&a[i+2]=='y'&&i+2<l)
{
j[3]++;
i+=2;
continue;
}
else if(a[i]=='J')
j[0]++;
else if(a[i]=='a')
j[1]++;
else if(a[i]=='y')
j[2]++;
for(i=0;i<3;i++)
{
if(j[i]<min)
min=j[i];
}
if(j[3]>0)
{
if(min-j[3]>=1)
printf("%lld",(min%mod*kuaisumi(2,j[3]))%mod);
else
printf("%lld",kuaisumi(2,j[3]-1));
}
else
{
printf("%lld",min%mod);
}
}