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;
}
posted @ 2021-02-11 10:58  Dazzling!  阅读(33)  评论(0编辑  收藏  举报