PAT_A1093
PAT甲级1093.
目录
A1093
题目
样例
输入:
APPAPT
输出:
2
思路和坑点
计算字符串中的PAT个数。使用数学中的排列组合知识,对于一个序列来说,如果PPPPPPATTTTTTTT,类似的字符串中,对于每一个A来说,若左边有np个P,右边有nt个T,则从左侧挑出一个P有np种可能,右侧挑出一个T有nt种可能,则它可以组成np*nt个“PAT”。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int cntP=0,cntT=0,ans=0; //分别统计T和P的个数
string pat;
getline(cin,pat);
for(int i=0;i<pat.size();i++) //统计T的个数
if(pat[i]=='T') cntT++;
for(int i=0;i<pat.size();i++){ //遍历字符串
if(pat[i]=='P') cntP++; //统计当前位置之前P的个数
else if(pat[i]=='T') cntT--; //计算当前位置之后T的个数
else {
ans+=cntT*cntP; //如果当前位置为A,根据排列组合的知识,组成的PAT个数为:A左侧的P的个数*A右侧的T的个数
ans%=mod; //每次计算过后取模
}
}
cout<<ans;
return 0;
}