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;
}
原文地址:https://www.cnblogs.com/tanghm/p/12658617.html