坑点:
①暴力计算会超时,只能用当前A字母左边的P个数乘以右边的T个数来计算,并且每次更新P个数和T个数时要用原来的个数加减差额(不然也会超时T-T)
②取模1000000007是指每个A对应的counts都要取模(不然过不了测试点3、4)
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=100010;
char s[maxn];
const int MOD=1000000007;
int NP(int p,int a){ //计算下标p~a范围内的P个数
int v=0;
for(int i=p;i<a;i++){
if(s[i]=='P') v++;
}
return v;
}
int NT(int t,int n){ //计算下标t~n范围内的T个数
int v=0;
for(int i=t;i<n;i++){
if(s[i]=='T') v++;
}
return v;
}
int Next(int a,int n){ //找到下一个A的下标
int i;
for(i=a+1;i<n;i++){
if(s[i]=='A'){
return i;
}
}
return -1;
}
int main(){
scanf("%s",s);
int len=strlen(s);
long long counts=0;
int p=0;
while(s[p]!='P') p++;
int a=Next(p,len),np=NP(p,a),nt=NT(a,len),abefore=a;
if(a==-1||nt==0){ //这个题目中没用到(如果没有A字符或者T字符则直接返回0)
printf("0");
}else{
while(a<len){
np=np+NP(abefore,a);
nt=nt-NT(abefore,a);
if(nt==0) break;
counts=(counts+np*nt)%MOD; //这里就得取模了
abefore=a;
a=Next(a,len);
if(a==-1) break;
}
printf("%lld",counts);
}
return 0;
}