题目
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位( P ),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位( P ),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
分析
前缀和 + 正倒序扫描 + 组合思想(A左边p的数量 * A右边T的数量 == 以该A为中心的pat数量)
AC代码
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 100010;
int pp[N], pt[N];
int main ()
{
string s;
cin>>s;
int sum_P = 0, mask = 0;
for(int i = 0 ; i < s.size() ; i ++ )
{
if(s[i] == 'P') sum_P ++ ;
if(s[i] == 'A') pp[ ++ mask] = sum_P;
}
//cout<<mask<<endl;
int sum_T = 0, mask1 = mask;
for(int i = s.size() - 1 ; i ; i -- )
{
if(s[i] == 'T') sum_T ++ ;
if(s[i] == 'A') pt[mask1 -- ] = sum_T;
}
//for(int i = 1 ; i <= mask ; i ++ ) printf("%d %d\n", pp[i], pt[i]);
ll sum = 0;
for(int i = 1 ; i <= mask ; i ++ )
{
sum += pp[i] * pt[i];
}
printf("%d", sum % 1000000007);
return 0;
}