1040 有幾個PAT——c實現
阿新 • • 發佈:2018-11-11
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
思路:
思路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; }
累加每個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; }