PAT乙级1040 有几个PAT (25 分)

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT乙级1040 有几个PAT (25 分)相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
题目地址

#include<cstdio>
#include<cstring>
const int MAXN=100010;
const int MOD=1000000007;
char str[MAXN];//字符串
int leftNump[MAXN]={0};//每一位左边含p的个数
int main()
{
	scanf("%s",str);
	int len=strlen(str);
	for(int i=0;i<len;i++)//从左到右遍历字符串 
	{
		if(i>0)//如果不是0号位 
		{
			leftNump[i]=leftNump[i-1]; 
		}
		if(str[i]=='P')//当前为是P 
		{
			leftNump[i]++;//加1 
		} 
	}
	int  ans=0,rightNumT=0;//ans为答案,rightNumT记录右边T的个数
	for(int i=len-1;i>=0;i--)//从右到左遍历 
	{
		if(str[i]=='T')
		{
			rightNumT++;
		} 
		else if(str[i]=='A')
		{
			ans=(ans+leftNump[i]*rightNumT)%MOD;
		}
	} 
	printf("%d\\n",ans);
	return 0;
} 
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
const int N=1e5+20;
const int mod=1000000007;
int p[N],t[N],ans;
string s;
int main(void)
{
	cin>>s;
	s='0'+s;
	for(int i=1;i<s.size();i++)
	{
		if(s[i]=='P') p[i]=p[i-1]+1;
        else p[i]=p[i-1];
		if(s[i]=='T') t[i]=t[i-1]+1;
        else t[i]=t[i-1];
	}
	for(int i=1;i<s.size();i++)
		if(s[i]=='A') ans=(ans+p[i-1]*(t[s.size()-1]-t[i]))%mod;
	cout<<ans;
}

以上是关于PAT乙级1040 有几个PAT (25 分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT乙级1040

PAT高效技巧算法---1040 有几个PAT (25分)

1040 有几个PAT (25 分)

PAT 乙级 1040.有几个PAT C++/Java

1040 有几个PAT(25 分)

1040 有几个PAT (25 分