PAT 乙级练习 题解合集
题目
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位§,第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位§,第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105 ,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
思路
对于字符串中的每一个A
,计算它左边的P
的数量乘以它右边的T
的数量,把所有这样的乘积相加即为所求,记得对1000000007
取余数。
怎么降低时间复杂度呢?在对字符串的遍历中,定义leftP
为当前字符左侧的P
的数量,初始值为0
,rightT
为当前字符左侧的T
的数量,初始值需要提前统计一遍。
在遍历过程中:
- 当前字符为
P
,++leftP
; - 当前字符为
T
,--rightT
; - 当前字符为
A
,累加leftP * rightT
,每累加一次就取模,防止溢出。
代码
#include <stdio.h>
#define MAX 100010
#define MAGIC 1000000007
typedef long long LL;
LL countChar(char *str, char x) {
LL ret = 0;
char *p = str;
while (*p) {
if (*p == x)
++ret;
++p;
}
return ret;
}
int main() {
char input[MAX];
gets(input);
LL ans = 0, leftP = 0, rightT = countChar(input, 'T');
char *p = input;
while (*p) {
if (*p == 'P')
++leftP;
else if (*p == 'T')
--rightT;
else if (*p == 'A') {
ans += leftP * rightT;
ans %= MAGIC;
}
++p;
}
printf("%lld", ans);
return 0;
}