PAT A1093 CountPATs

思路:针对每个特定的A,统计其左侧P的数量和右侧T的数量,对答案的贡献为P*T的值。P的数量采用数组,ans在统计T的过程中计算出。

相似题目:PAT A1001 Quick Sort

#include<cstdio>
#include<cstring>
#define MAXN 100005
#define MOD 1000000007

int leftNum[MAXN];
char str[MAXN];

int main() {
    fgets(str, MAXN, stdin);
    int len = strlen(str);
    if(str[0] == 'P') leftNum[0] = 1;
    for(int i = 1; i < len; i++) {
        leftNum[i] = leftNum[i-1];
        if(str[i] == 'P') leftNum[i]++;
    }
    int rightNum = 0;
    int ans = 0;
    for(int i = len-1; i >= 0; i--) {
        if(str[i] == 'T') {
            rightNum++;
        } else if(str[i] == 'A') {
            ans = (ans + (leftNum[i] * rightNum) % MOD) % MOD;
        }
    }
    printf("%d", ans);
    return 0;
}