一道简单题,每个A能够组成的PAT个数为它前面的P的个数乘以它后面的T的个数,然后把每个A能组成的PAT个数再加起来,就是总的PAT个数啦。定义一个数组cnt[100001][2],每个位置的0号元素为该位置前面P的个数,每个位置的1号元素为该位置前面T的个数。从前往后遍历一遍字符串可以得到每个位置前面P的个数,从后往前再遍历一遍可以得到每个位置后面A的个数,最后遍历一遍字符串为每个A能组成的PAT求和。三次遍历,时间复杂度为O(n).
下面贴上AC代码
#include<stdio.h>
#include<string.h>
#define divide 1000000007
int cnt[100001][2];
char str[100001];
int main()
{
int cntP=0, cntT=0;
scanf("%s", str);
// 统计位置i前面P的个数
for (int i = 0; i < strlen(str); i++)
{
if (str[i] == 'P')
{
cntP++;
}
cnt[i][0] = cntP;
}
// 统计位置i后面T的个数
for (int i = strlen(str) - 1; i >= 0; i--)
{
if (str[i] == 'T')
{
cntT++;
}
cnt[i][1] = cntT;
}
// 对每一个A,它能够形成的PAT个数是它前面P的个数乘以它后面T的个数
int ans = 0;
for (int i = 0; i < strlen(str); i++)
{
if (str[i] == 'A')
{
ans += (cnt[i][0] * cnt[i][1]) % divide;
ans = ans%divide;
}
}
printf("%d\n", ans);
return 0;
}