PAT 乙级练习 1040 有几个PAT

PAT 乙级练习 题解合集

本题链接

题目

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

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

输入格式:
输入只有一行,包含一个字符串,长度不超过10​5​​ ,只包含 P、A、T 三种字母。

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

输入样例:

APPAPT

输出样例:

2

思路

对于字符串中的每一个A,计算它左边的P的数量乘以它右边的T的数量,把所有这样的乘积相加即为所求,记得对1000000007取余数。


怎么降低时间复杂度呢?在对字符串的遍历中,定义leftP为当前字符左侧的P的数量,初始值为0rightT为当前字符左侧的T的数量,初始值需要提前统计一遍。

在遍历过程中:

  1. 当前字符为P++leftP
  2. 当前字符为T--rightT
  3. 当前字符为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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值