原題鏈接:
思路:用兩個數組分別統計從左到右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;
}