1093 Count PAT's (25 分)
对一个确定位置的A来说,以它形成的PAT的个数等于它左边P的个数乘以它右边T的个数。
例如对字符串APPAPT的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT的个数就是2x1=2。
于是问题就转换为,对字符串中的每个A,计算它左边P的个数与它右边T的个数的乘积,然后把所有A的这个乘积相加就是答案。
const int N=1e5+10;
int cntp[N],cntt[N];
char s[N];
int n;
int main()
{
cin>>s+1;
n=strlen(s+1);
for(int i=1;i<=n;i++)
if(s[i] == 'P') cntp[i]=cntp[i-1]+1;
else cntp[i]=cntp[i-1];
for(int i=n;i;i--)
if(s[i] == 'T') cntt[i]=cntt[i+1]+1;
else cntt[i]=cntt[i+1];
int res=0;
for(int i=1;i<=n;i++)
if(s[i] == 'A')
res=(res+cntp[i]*cntt[i])%mod;
cout<<res<<endl;
//system("pause");
return 0;
}