专栏:PAT乙级刷题笔记
题目
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(p),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式
输入只有一行,包含一个字符串,长度不超过 1 0 5 10^5 105 ,只包含 P、A、T 三种字母。
输出格式
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例
APPAPT
输出样例
2
分析
首先,对任意一个A,假设其前面有
a
a
a个字母P,其后有
b
b
b个字母T,那么包含有该A的PAT共有
a
×
b
a\times b
a×b个。
所以,只需要对每一个字母A,统计其前面有多少个字母P,其后有多少个字母T。
为了降低时间复杂度,设置了两个大数组P[100001]、T[100001],分别存储对应位置字母A,其前P的数量和后T的数量。
用Pnums和Tnums记录当前P、T的数量。
然后从前往后遍历数P,从后往前遍历数A。
代码
#include<iostream>
#include<string>
using namespace std;
int main(){
int P[100001] ={0},T[100001]={0},Pnums = 0,Tnums = 0;
string s;cin>>s;
for(int i = 0,j = s.length()-1;i < s.length();++i,--j){
if(s[i] == 'P')++Pnums;
if(s[i] == 'A')P[i] = Pnums;
if(s[j] == 'T')++Tnums;
if(s[j] == 'A')T[j] = Tnums;
}
long long sum = 0;
for(int i = 0;i < s.length();++i)
sum += P[i]*T[i];
cout<<sum%1000000007;
return 0;
}