题目大意:
给定一个只包含P,A,T的字符串,让其计算有多少个PAT组合
算法思路:
对一个确定位置的A来说,以它形成的PAT的个数等于它左边P的些个数乘以它右边T的个数。例如对字符申APPAPT的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT的个数就是2x1=2.于是问题就转换为:对字符串中的每个A,计算它左边P的个数与它右边T的个数的乘积,然后把所有A的这个乘积相加,最后的结果就是该字符串中所有的PAT组合数目。那么现在就是需要获取每一个位置的左边的P和右边的T的数,在这里我们使用leftP
和rightP
分别保存当前位置左边的P和右边的T的个数。之所以可以这样保存,是因为当前位置i左边的P的个数和i-1位置左边P的个数具有继承性,要么相等,要么相差1。那么这样我们可以先遍历一遍所有的字符串中所有的T出现的个数,然后使用ans
保存所有的PAT组合数目,再次遍历字符串的过程中,如果当前字符为P那么就让leftP
加1,如果为T,就让rightT
减一,如果为A,就累计leftP*rightT
。
注意点:
1、测试点3和4考察取模,不能在最后统计完成后再取模,需要每计算一次就取模。
提交结果:
AC代码:
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
int main(){
string s;
cin>>s;
int len = s.size();
int leftP = 0;
int rightT = 0;
int ans = 0;//记录PAT的个数
for (int i = 0; i < len; ++i) {
if(s[i]=='T'){
++rightT;
}
}
for (int j = 0; j < len; ++j) {
if(s[j]=='P'){
++leftP;
} else if(s[j]=='T'){
--rightT;
} else if(s[j]=='A'){
ans += leftP*rightT;
ans %= 1000000007;
}
}
cout<<ans;
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。