思路:对一个确定位置的A来说,以它形成的PAT的个数等于它左边p的个数乘以它右边T的个数
还有右侧不用定义数组,边统计边计算最后结果。
#include<cstdio>
#include<cstring>
const int maxn=100010;
const int mod=1000000007;
int main()
{
char leftp[maxn]={0};
char str[maxn];
gets(str);
int len=strlen(str);
for(int i=0;i<len;i++)
{
if(str[i]=='P') leftp[i]=leftp[i-1]+1;
else
{
if(i>0) leftp[i]=leftp[i-1];
else leftp[0]=0;
}
}
for(int i=0;i<len;i++)
{
printf("%d",leftp[i]);
}
printf("\n");
int ans=0,rightnumT=0;
for(int i=len-1;i>=0;i--)
{
if(str[i]=='T') rightnumT++;
else if(str[i]=='A')
{
ans=(ans+leftp[i]*rightnumT)%mod;
}
}
printf("%d\n",ans);
return 0;
}