【算法笔记】B1040 有几个PAT

时间:2022-02-25 09:48:43
1040 有几个PAT (25 分)

字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。

现给定字符串,问一共可以形成多少个 PAT

输入格式:

输入只有一行,包含一个字符串,长度不超过105​​,只包含 PAT 三种字母。

输出格式:

在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。

输入样例:

APPAPT

输出样例:

2

思路:

对于每个A,能组成PAT的个数是左边P的个数和右边T的个数的乘积,因此只统计每个字母左边P的个数即可,时间复杂度为O(len)。

然后从后往前统计T的个数,每遇到一个A就计算一次并加到结果中。

 

codes:

 1 #include<iostream>
 2 using namespace std;
 3 const int maxn = 100010;
 4 const int mod = 1000000007;
 5 string str;
 6 int leftNumP[maxn]={0};
 7 int main(){
 8     getline(cin, str);
 9     int len = str.size();
10     int cnt = 0;
11     for(int i = 0; i < len; i++){
12         if(i > 0) 
13             leftNumP[i] = leftNumP[i - 1];
14         if(str[i] == 'P') 
15             leftNumP[i]++;
16     }
17     int rightNumT = 0;
18     for(int i = len - 1; i >= 0; i--){
19         if(str[i] == 'T') 
20             rightNumT ++;
21         else if(str[i] == 'A'){
22             cnt = (cnt + leftNumP[i] * rightNumT) % mod;
23         }
24     }
25     cout<<cnt;
26     return 0;
27 }