胡凡算法之——有几个PAT

题目如下:

思路:1.这种类型的题有很多,一般的基本思路就是找中间数“A”,知道A之前有a个P,之后有b个“T”,那么对于这一个A来说就有a*b个“PAT”,按此方法将所有“A”所代表的个数加起来,就是所有的个数,也就是所谓的“排列组合”。

          2.想到这之后,就剩下一个难题了,怎么找到“A”之前所有的“P”,我们可以用一个数组把每一位是不是“P”表示出来,如果是"P",我们让这一位比上一位加一,不是“P”,就和上一位保持一致;解决了“P”之后再从右往左找“T”,这时就可以边找边计算结果了;

胡凡算法上面给了详细的解释和要注意的点:

以下是代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int MAXN = 100010;
const int MOD = 1000000007;
char str[MAXN];
int leftNumP[MAXN] = {0};     //存左边P的个数; 

int main()
{
	gets(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]++;
		}
	} 
	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+ leftNumP[i]*rightNumT) % MOD;
			
		}
	}
	cout<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dyyay521/article/details/88665665