[PAT-A 1093]Count PAT's

在这里插入图片描述
题目大意:
字符串 APPAPT中包含了两个单词PAT,其中第一个PAT是第2位§,第4位(A),第6位(T);第二PAT是第3位§,
第4位(A),第6位(T)。
现给定字符串,问一共可以形成多少个 PAT?

思路:
1)直接暴力求解会超时。
2)对一个确定位置的A来说,以它形成的PAT的格式等于它左边P的个数乘以它右边T的个数,例如对字符串APPAPT来说,
A的左边两个P,右边一个T,所以共形成2个PAT。
3)定义数组int型数组leftNumP,其中leftNumP[i]表示第i个位置之前有多少个P,包括本位。可以在输入的时候就处理。
4)定义int型变量rightNumT,表示当前位置(包括当前位置后面又多少个T),如果遇到A,则令ans加上rightNumT*leftNumP[i]的值
再按照题目要求取余

//PAT_A 1093
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 100010;
const int MOD = 1000000007;
char str[maxn];
int leftNumP[maxn] = { 0 };//每一位左边字母P的个数(含当前位)
int main() {
	(void)scanf("%s", str);
	int len = strlen(str);
	for (int i = 0; i < len; i++) {
		if (i > 0) leftNumP[i] = leftNumP[i - 1];//不是首位的话继承上一位的值
		if (str[i] == 'P')leftNumP[i]++;//如果是P,加1
	}
	int ans = 0, rightNumT = 0;
	for (int i = len - 1; i >= 0; i--) {
		if (str[i] == 'T')rightNumT++;
		else if (str[i] == 'A')ans = (ans + rightNumT * leftNumP[i]) % MOD;
	}
	printf("%d\n", ans);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值