题目
计算PAT的子串,只要前后顺序对了就算试子串.
思路
一开始我是这样想的,只要按照顺序PAT的顺序数出P的数量,A的数量,T的数量然后相乘就可以了,这种思路只对字符串t后面没有pat子串时有效,说白了就是还有一些情况没有考虑到
分析:要想知道构成多少个PAT,那么遍历字符串后对于每一A,它前面的P的个数和它后面的T的个数的乘积就是能构成的PAT的个数。然后把对于每一个A的结果相加即可~辣么就简单啦,只需要先遍历字符串数一数有多少个T~然后每遇到一个T呢~countt–;每遇到一个P呢,countp++;然后一遇到字母A呢就countt * countp~~把这个结果累加到result中~~最后输出结果就好啦~对了别忘记要对10000000007取余哦~~
代码中为什么p的数量要加而t的数量要减了,这是因为t的总数量已经计算出来了,总数减去a前面的就能知道后面的T(很机智唉!!!)
代码
#include <iostream>
using namespace std;
int main() {
string s;
cin>>s;
int pc = 0,tc = 0;
int res = 0;
for(int i=0; i<s.size(); i++) {
if(s[i]=='T') {
tc++;
}
}
for(int i=0; i<s.size(); i++) {
if(s[i]=='P') {
pc++;
} else if(s[i]=='T') {
tc--;
} else if(s[i]=='A') {
res = (res+(pc*tc)%1000000007)%1000000007;
}
}
cout<<res;
return 0;
}
??正文结束??