#include<iostream>
using namespace std;
const int MAXN=100001;
struct Node{
int left;
int right;
Node(){
left=0;
right=0;
}
}node[MAXN];
int main()
{
string s;
cin>>s;
int len=s.length();
int cntp=0;
for(int i=0;i<len;i++){
if(s[i]=='P'){
cntp++;
}else if(s[i]=='A'){
node[i].left=cntp;
}
}
int cnta=0;
for(int i=len-1;i>=0;i--){
if(s[i]=='T'){
cnta++;
}else if(s[i]=='A'){
node[i].right=cnta;
}
}
int ans=0;
for(int i=0;i<MAXN;i++){
if(s[i]=='A')
ans=(ans+node[i].left*node[i].right%1000000007)%1000000007;
}
cout<<ans<<endl;
return 0;
}
注意题目中,output the result moded by 1000000007
因为测试样例结果过大,需要将结果取模,如果是在最后取模,因为在中间过程已经越界,结果还是不对的,导致最后两个测试点过不去。正确的做法应该是在遍历每个A的时候就取模,有效防止越界。这两个测试点参考自https://blog.csdn.net/timso1997/article/details/80503929