1040 有几个PAT
题目链接-1040 有几个PAT
解题思路
累加每个A
两边P
和T
的个数之积即可
- 对于每个
A
来说,它所能构成的PAT
的数目为在它之前P
的数目与它之后T
的数目的乘积 - 对于
A
之后T
的数目,我们可以先预处理一下,算出整个字符串中T
的数目 t t t,然后后续遍历字符串的时候每遇到一个T
就 t − − t-- t−−,就保证了遇到A
时,当前 t t t就是这个A
之后T
的数目 - 而对于
A
之前P
的数目我们只需遍历字符串的时候每遇到一个P
就 p + + p++ p++记录即可,保证了遇到A
时,当前 p p p就是这个A
之前P
的数目 - 具体操作见代码
附上代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=1e9+7;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
typedef long long ll;
typedef pair<int,int> PII;
string s;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>s;
ll p=0,t=0;
for(int i=0;i<s.length();i++)
if(s[i]=='T')
t++;
ll ans=0;
for(int i=0;i<s.length();i++){
if(s[i]=='P') p++;
if(s[i]=='T') t--;
if(s[i]=='A')
ans=(ans+p*t%M)%M;
}
cout<<ans<<endl;
return 0;
}