写在前面
- 思路分析
- 对于每1个A,它前面P的个数和它后面T的个数的乘积构成PAT个数。
- 对于每1个A的结果相加即可
- 先循环计数字符串有多少个T
- 再循环计算
- 每遇到1个T,cntt–
- 每遇到1个P,cntp++
- 每遇到字母A,结果累加cntt * cntp,并取余
- 核心问题: 计数规律,
最初理解错误
- 核心问题解决后,10分钟a题
- 问题点
- 大数相乘,避免溢出
-
result = (result + (cntp*cntt)%1000000007)%1000000007;
- 在大数相乘的时候,因为(a∗b)%c=((a%c)∗(b%c))%c,所以相乘时两边都对1000000007取模,再保存在int64里面不会溢出
测试用例
input:
APPAPT
output:
2
input:
APPAPTAT
output:
7
ac代码
- 参考链接
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int len = s.length(), result = 0, cntp = 0, cntt = 0;
for(int i=0; i<len; i++) {
if(s[i]=='T')
cntt++;
}
for(int i=0; i<len; i++) {
if(s[i] == 'P') cntp++;
if(s[i]=='T') cntt--;
if(s[i]=='A') result = (result + (cntp*cntt)%1000000007)%1000000007;
}
cout << result;
return 0;
}