题目概述
字符串 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来说,以它形成的PAT的个数等于它左边P的个数乘以它右边T的个数。例如对字符串appapt的中间那个A来说,它左边有两个P,右边有一个T,因此这个A能形成的PAT个数就是2*1=2.于是问题就转换成对字符串中的每个A,计算它左边的P的个数与它右边的T的个数的乘积,然后把所有A的这A这个乘积相加就是答案。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
long P=0,A=0,T=0,leftT=0,PAT=0;//数据太大,用int会溢出
for(char c:s)
if(c=='T')
T++;
for(char c:s)
{
if(c=='P')
P++;
if(c=='T')
leftT++;
if(c=='A')
PAT+=P*(T-leftT);
}
cout <<PAT%1000000007;
return 0;
}
总结
感谢胡凡的《算法笔记》,没有这本书我根本就无法AC。
再接再厉,明天再刷一题