1. 程式人生 > >1040 有幾個PAT——c實現

1040 有幾個PAT——c實現

1040 有幾個PAT (25 分)

字串 APPAPT 中包含了兩個單詞 PAT,其中第一個 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二個 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

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

輸入格式:

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

輸出格式:

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

輸入樣例:

APPAPT

輸出樣例:

2

思路:

思路1:這道題可以倒著看,T之前的A的數量可以得到AT的數量(這裡注意A前一定要有P),A之前P的數量可以得到PA的數量,因此PAT的數量應該是A之前P的數量之和和T之前A的數量之和的積。

思路2:PAT Basic 1040. 有幾個PAT(25)(C語言實現)

從前向後掃描:

  • 每個A對應的PA組合數量是A之前P的數量
  • 每個T對應的PAT組合數量是T之前所有A對應的PA組合數量的累加,
  • 所有的PAT組合數量是所有T對應的PAT組合數量的累加
#include <stdio.h> 
#define LIM 1000000007 
int main() { 
  unsigned int P = 0, PA = 0, PAT = 0; 
  char c; 
  while((c = getchar()) != '\n') { 
    if(c == 'P') P++; 
    if(c == 'A') PA = (PA + P) % LIM; 
    if(c == 'T') PAT = (PAT + PA) % LIM; 
  } 
  printf("%d", PAT); 
  return 0; }

思路3:1040. 有幾個PAT(25)-PAT乙級真題

累加每個A兩邊P和T的個數之積。

分析:要想知道構成多少個PAT,那麼遍歷字串後對於每一A,它前面的P的個數和它後面的T的個數的乘積就是能構成的PAT的個數。然後把對於每一個A的結果相加即可~~辣麼就簡單啦,只需要先遍歷字串數一數有多少個T~~然後每遇到一個T呢~~countt–;每遇到一個P呢,countp++;然後一遇到字母A呢就countt * countp~~把這個結果累加到result中~~最後輸出結果就好啦~~對了別忘記要對10000000007取餘哦~~

#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;
}