1. 程式人生 > >1040. 有幾個PAT(25)-PAT乙級真題

1040. 有幾個PAT(25)-PAT乙級真題

1040. 有幾個PAT(25)
字串APPAPT中包含了兩個單詞“PAT”,其中第一個PAT是第2位(P),第4位(A),第6位(T);
第二個PAT是第3位(P),第4位(A),第6位(T)。
現給定字串,問一共可以形成多少個PAT?
輸入格式:
輸入只有一行,包含一個字串,長度不超過105,只包含P、A、T三種字母。
輸出格式:
在一行中輸出給定字串中包含多少個PAT。由於結果可能比較大,只輸出對
1000000007取餘數的結果。
輸入樣例:
APPAPT
輸出樣例:
2
分析:要想知道構成多少個PAT,那麼遍歷字串後對於每一A,它前面的P的個數和它後面的T的個數的乘積就是能構成的PAT的個數。然後把對於每一個A的結果相加即可~~辣麼就簡單啦,只需要先遍歷字串數一數有多少個T~~然後每遇到一個T呢~countt–;每遇到一個P呢,countp++;然後一遇到字母A呢就countt * countp~~~把這個結果累加到result中~~~~最後輸出結果就好啦~~對了別忘記要對10000000007取餘哦~~~~

【PS:假設神奇的你對每次都遇到的神奇的為什麼要對1000000007取模感興趣,戳那個加下劃線的連結即可~~~^_^】

#include <iostream>
#include <string>
using namespace std;
int main() {
    string s;
    cin >> s;
    int len = s.length(), result = 0, countp = 0, countt = 0;
    for (int i = 0; i < len; i++) {
        if (s[i] == 'T')
            countt++;
    }
    for (int i = 0; i < len; i++) {
        if (s[i] == 'P') countp++;
        if (s[i] == 'T') countt--;
        if (s[i] == 'A') result = (result + (countp * countt) % 1000000007) % 1000000007;
    }
    cout << result;
    return 0;
}