原题链接:
思路:用两个数组分别统计从左到右P的数目和从右到左T的数目,最后针对每一个A,把左边的P与右边的T的数目相乘即为当前位置的PAT数目,遍历每一个A相加就是所求,详见代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
const int mod=1000000007;
typedef long long ll;
string str;
ll Left[maxn],Right[maxn];
void solve(){
cin>>str;
memset(Left,0,sizeof(Left));
memset(Right,0,sizeof(Right));
ll ans=0;
int num1=0,num2=0;
for(int i=0;i<str.size();i++){
if(str[i]=='P'){
++num1;
}
//从左到右P的数目
Left[i]=num1;
}
for(int i=str.size()-1;i>=0;i--){
if(str[i]=='T'){
++num2;
}
//从右到左T的shumu
Right[i]=num2;
}
for(int i=0;i<str.size();i++){
if(str[i]=='A'){
//注意取余,最开始写成ans+=(Left[i]*Right[i])%mod;
ans=(ans+(Left[i]*Right[i])%mod)%mod;
}
}
cout<<ans<<endl;
}
int main(){
//freopen("in.txt","r",stdin);
solve();
return 0;
}