1040 有几个PAT (25分)

25分题中不是很难的一道,没错我就是挑软柿子捏,今天一定要把basic搞完,阿弥陀佛别拖拉了。。。


第一次提交后三个测试点运行超时(循环过多吧)。。。。一开始是每遇到一个A就从前往后循环看这个A前面有多少P,有多少T。

第二次提交后后两个测试点答案错误,但是不超时了!微笑 -

由于结果可能比较大,只输出对 1000000007取余数的结果。(题目中的说明)

不要忽略这一句,这说明了个数有可能很大,所以将sum改为longlong型后面两个测试点就过了!!

呵呵。。。。


算法思想就是记录每一个A前后的P、T个数,然后乘一下再加一下~

#include<iostream>
#include<string>

using namespace std;

int main() {
	string a;
	int i, j, k;
	int p[100001] = { 0 };
	int t[100001] = { 0 };
	long long int sum = 0;
	int ptemp = 0, ttemp = 0;
	getline(cin, a);
	j = 0;
	//从前往后统计每一个A前P的个数
	for (i = 0; i < a.length(); i++) {
		if (a[i] == 'P') {
			ptemp++;
		}
		if (a[i] == 'A') {
			p[j++] = ptemp;
		}
	}
	k = 0;
	//从后往前统计每一个人A后T的个数
	for (i = a.length() - 1; i >= 0; i--) {
		if (a[i] == 'T') {
			ttemp++;
		}
		if (a[i] == 'A') {
			t[k++] = ttemp;
		}
	}
	//p--123  
	//t--321
	for (i = 0; i < j; i++) {
		sum += p[i] * t[j - i - 1];
	}
	
	cout << sum % 1000000007 << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值