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 分)的主要内容,如果未能解决你的问题,请参考以下文章