PAT (Basic Level) Practice (中文)B1040 有幾個PAT (25 分)(C++)(遞推思想)

1040 有幾個PAT (25 分)
字符串 APPAPT 中包含了兩個單詞 PAT,其中第一個 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二個 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。

現給定字符串,問一共可以形成多少個 PAT?

輸入格式:

輸入只有一行,包含一個字符串,長度不超過10​5,只包含 P、A、T 三種字母。

輸出格式:

在一行中輸出給定字符串中包含多少個 PAT。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。

輸入樣例:

APPAPT
輸出樣例:

2

//本題只需要計算每個A之前P的個數與其之後的T的個數的乘積的累加和即可
//即Pi*Ti(i從1到Anum)的累加和
//在計算Pi和Ti時可以用遞推思想,本題表現在程序裏即Pi、Ti不清零,繼續計算下一個

using namespace std;
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>

char S[100010] = {0};//存放字符串

int main()
{
    int cnt = 0, Tnum = 0, Px = 0, Tx = 0;
    scanf("%s", S);
    int N = strlen(S);
    for(int i=0; i<N; i++)
    {
        if(S[i] == 'T') Tnum++;//T的總數
    }
    for(int i=0; i<N; i++)
    {
        if(S[i] == 'P') Px++;//某一個A之前P的個數
        if(S[i] == 'T') Tx++;//某一個A之前T的個數;則Tnum - Tx即爲該A之後T的個數
        if(S[i] == 'A')
        {
            cnt += Px*(Tnum - Tx);//計算由該A可以組成的PAT的個數;由於S長度小於10^5,故累加不會導致越界
            cnt %= 1000000007;//按題意取餘,避免溢出
        }
    }
    printf("%d", cnt);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章