题目
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 ### PAT?
输入格式
输入只有一行,包含一个字符串,长度不超过10^5,只包含 P、A、T 三种字母
输出格式
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
思路
思路来自于排列组合,确定中间的A的位置,则PAT的数量是左边的P的适量乘以右边的T的数量。先统计所有T的数量。遍历字符串,找到每一个A,其左边P的数量由计数器确定,其右边T的数量由所有T的数量减去左边的T的数量。
注意,因为数据过大,每找到一个A的数据,就要进行一次mod。
//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
// 在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
// 记录每个A的前面有多少个P后面有多少个T,答案位两数相乘
string s;
int res;
int cntP,cntT;
int main(){
cin >> s;
int len = s.size();
for (int i = 0; i < len; i++){
/* code */
if(s[i] == 'T')
cntT++;//记录所有T
}
// cout << cntT;
// cout << cntP;
for (int i = 0; i < len; i++){
/* code */
if(s[i] == 'P'){
cntP++;//这个A前面有多少个P
}
else if(s[i] == 'T')
cntT--;//这个A后面有多少个T,所有的减去A前面的
else if(s[i] == 'A'){
res = (res + (cntP * cntT) % 1000000007) % 1000000007;
}
}
cout << res << endl;
return 0;
}