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
======================================
找规律呗,找出来就AC,找不出来就GG。
规律是:
每一个A前面的P的个数,乘上这个A后面的T的个数。
把每一个A乘完的结果累加就是结果。
现在的问题是:对于每一个A,如何获取它前面 P 的个数,以及它之后 T 的个数。
遍历一遍字符串,我们获得 T 的总数为cntT。
再遍历一遍字符串,P的个数存在cntP里,每碰到一个P,cntP++, 每碰到一个T,cntT--,每碰到一个A,就把cntP * cntT累加在result里。
遍历完后,输出result。
=====================================
#include <iostream>
using namespace std;
int main(){
string s;
cin >> s;
int cntP = 0, cntT = 0, result = 0, len = s.length();
for(int i = 0; i < len; i++)
if(s[i] == 'T') cntT++;
for(int i = 0; i < len; i++){
if(s[i] == 'P') cntP++;
if(s[i] == 'A') result = (result + cntP * cntT % 1000000007) % 1000000007;
if(s[i] == 'T') cntT--;
}
printf("%d", result);
return 0;
}