PAT (Advanced Level) Practice
1093 Count PAT’s (25分)
The string APPAPT
contains two PAT
's as substrings. The first one is formed by the 2nd, the 4th, and the 6th characters, and the second one is formed by the 3rd, the 4th, and the 6th characters.
Now given any string, you are supposed to tell the number of PAT
's contained in the string.
Input Specification:
Each input file contains one test case. For each case, there is only one line giving a string of no more than 105 characters containing only P
, A
, or T
.
Output Specification:
For each test case, print in one line the number of PAT
's contained in the string. Since the result may be a huge number, you only have to output the result moded by 1000000007.
Sample Input:
APPAPT
Sample Output:
2
个人代码:
#include<cstdio>
#include<cstring>
const int MAXN = 100010;
const int MOD = 1000000007;
char PATs[MAXN];
int PA[MAXN], AT[MAXN]; //记录每个A之前的P的个数A之后的T的个数
int main() {
scanf("%s", PATs);
int len = strlen(PATs);
int cntP = 0, cntA = 0, cntT = 0, cntPAT = 0; //分别记录P,A,T,PAT的总数
//先确定每个A之前的P的个数
for(int i = 0; i < len; i++) {
if(PATs[i] == 'P') {
cntP++;
} else if(PATs[i] == 'A') {
PA[cntA] = cntP;
// printf("PA[%d]=%d\n", cntA, PA[cntA]);
cntA++;
} else continue;
}
//先确定每个A之后的T的个数
int temp = cntA - 1;
for(int i = len - 1; i >= 0; i--) {
if(PATs[i] == 'T') {
cntT++;
// printf("cntT=%d\n",cntT);
} else if(PATs[i] == 'A') {
// printf("cntT=%d\n",cntT);
AT[temp] = cntT;
// printf("AT[%d]=%d\n", temp, AT[temp]);
temp--;
} else continue;
}
//将PA与AT的下标0-cntA每位相乘,然后求和即得cntPAT
for(int i = 0; i < cntA; i++) {
// printf("PA[%d]=%d\n", i, PA[i]);
// printf("AT[%d]=%d\n", i, AT[i]);
cntPAT += PA[i] * AT[i];
cntPAT %= MOD;
}
// cntPAT %= MOD;
printf("%d", cntPAT);
return 0;
}
思路提示:
第一遍最后两个测试点没过,原因是只在输出前取模会溢出,因此每轮循环都要取模。另外,最后一次循环可以放在计算T的时候。