对于数组中的一个A,分别统计它左边的P数,右边的T数,两者相乘,即是这个A可以组成的PAT数。
对数组中的每个A重复上述动作。
#include<cstring>
#include<cstdio>
using namespace std;
int leftPCount[100000] = { 0 }, rightTCount[100001] = { 0 };
char input[100000];
int main() {
scanf("%s", &input);
int len = strlen(input);
if (input[0] == 'P')
leftPCount[0] = 1;
for (int i = 1;i < len;i++) {
if (input[i] == 'P')
leftPCount[i] = leftPCount[i - 1] + 1;
else leftPCount[i] = leftPCount[i - 1];
}
for (int i = len - 1;i >= 0;i--) {
if (input[i] == 'T')
rightTCount[i] = rightTCount[i + 1] + 1;
else rightTCount[i] = rightTCount[i + 1];
}
long long patSum = 0;
for (int i = 1;i < len - 1;i++) {
if (input[i] == 'A') {
patSum += leftPCount[i] * rightTCount[i];
patSum %= 1000000007;
}
}
printf("%lld", patSum);
}