PAT乙级-1040. 有几个PAT(25)-详解+代码

版权声明:转载请联系博主、标明出处 https://blog.csdn.net/jyfbug/article/details/79970540

题目:PAT乙级 1040. 有几个PAT(25)

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

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

输入格式:

输入只有一行,包含一个字符串,长度不超过105,只包含P、A、T三种字母。

输出格式:

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

输入样例:
APPAPT
输出样例:
2

思路:

    题目中给的信息很少,测试样例也仅有一例,可以说仅通过题目所给的测试样例是非常简单的,不需要考虑到任何事情。但是题目中有一个地方(可能是一个小提示)说由于结果可能较大,只输出对1000000007取余数的结果,这时候就想了:为什么结果会有这么多?同时要考虑到的是,因为结果可能较大,保险起见,采用long long int来存储个数。
    另一方面,因为是考虑PAT的个数,只能先有了P,才考虑其后面的AT,如果正向扫描,对于每个P扫描其后的AT,那么会出现两次循环循环时间过长。因此采用逆序的扫描过程,从后向前扫描。
    因为考虑到P、A和T是交叉分布的,只有见到了A才考虑其后的P,只有见到了P才考虑其后的AT,如:ATP中的“PAT”个数为0。因此这是一个排列组合问题。例:APATATTT中的“PAT"个数为7(从后向前见到第一个A时后有3个T,见到第二个A时后有4个T,见到第一个P时后有7个AT)。
    因此采用numT来记录T的个数,numAT记录当前AT的个数,每遇到A就将numT加上,numPAT记录PAT的个数,每遇到P就将numAT加上。最后输出numPAT。
PS:100000串定义为100001个char,strlen得到的长度为带‘\0'的长度。

#include<stdio.h>
#include<string.h>
#define N 100001
int main()
{
	char s[N];
	long long numPAT=0;//记录符合条件的P的个数
	long long numT=0, numAT=0;//numT为T个数,numAT为AT个数
	int i,len;
	scanf("%s", s);
	len = strlen(s);
	for (i = len-1; i >= 0; i--)
	{
		if (s[i] == 'T')
		{
			numT++;
		}
		if (numT != 0 && s[i] == 'A')//已经有了T才会出现AT
		{
			numAT += numT;	//因为是排列关系所以为+
		}
		if (numAT != 0 && s[i] == 'P')//已经有了AT才会出现PAT
		{
			numPAT+=numAT;
		}
	}
	printf("%lld", numPAT% 1000000007);
	return 0;
}

阅读更多

没有更多推荐了,返回首页