PAT乙级 1040 有几个PAT

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

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

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

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

输入样例:

APPAPT

输出样例:

2

思路:

最简单的三层循环判断会导致超时,通过遍历两边字符串得出结果

第一遍记录第一个 A 的位置、第一个 A 之前 P 的数量 num_p、之后 T 的数量 num_t(如果字符串中没有 A 记录的是字符串结束符的下标)

第二遍从第一个 A 开始,向后每遇到一个 P ,代表下一个 A 之前 P 的数量多了一个,即 num_p++,每遇到一个 T ,代表下一个 A 之后 T 的数量少了一个,即 num_t--

对于 第 i 个 A ,它能组成的 PAT 的数量是num_p * num_t,即 它之前 P 的数量 num_p 乘以 它之后 T 的数量 num_t

及时检查 count 的值,确保不超过 int 能表示的范围


#include<iostream>
using namespace std;
const int N = 1e5 + 10;
char str[N] = { '\0' };
int main() {
	int i, j, count = 0, num_p = 0, num_t = 0;
	scanf("%s", str);
	if(str[0]=='P') num_p++;
	for (i = 1; str[i] != '\0'; i++)
		if (str[i] == 'P') num_p++;
		else if (str[i] == 'A') break;
	j = i;
	for(; str[i] != '\0'; i++)   
		if (str[i] == 'T') num_t++;
	for (i = j ; str[i] != '\0'; i++) {
		if (str[i] == 'P') num_p++;
		else if (str[i] == 'A') count += num_p * num_t;
		else num_t--;
		if (count >= 1000000007)
			count%= 1000000007;
	}	
	printf("%d", count);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值