字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T);第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过10^5,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
思路:
本题难度较大,但是不是编程上的难度,而是算法上的难度,一开始想的是用三重循环,一个一个统计PAT的个数,但是这样的算法后面的几个测试用例都会超时,最后实在是想不出来什么好的方法,借鉴网上大神的方法,豁然开朗,只要对每一个A的前后进行P与T的计数,用(A前P的数量)*(A后T的数量),即可得到由此A可以构建的所有PAT的数量,最后累加即可,整个代码也很简洁。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string pat;
cin >> pat;
long long count = 0, count_p = 0, count_t = 0;//注意要使用long long类型,不然乘法的时候有可能越界
for (int i = 0; i < pat.size(); i++)//首先计算总共有多少个T
{
if (pat[i] == 'T')count_t++;
}
for (int i = 0; i < pat.size(); i++)//对每一个A进行遍历,计算前面多少个P,后面多少个T
{
if (pat[i] == 'P')count_p++;//前面有P就增加
if (pat[i] == 'T')count_t--;//前面有T证明后面的T的个数要减少
if (pat[i] == 'A')count += count_p*count_t;//A可以构建的所有PAT的计数
}
cout << count % 1000000007;//总的个数需要对1000000007取余数
return 0;
}
代码:
//1040 有几个PAT
//本题难度较大,但是不是编程的难度而是算法的难度,一开始想的是用三重循环,一个一个统计pat的个数,但是这样后面的几个测试用例都会超时
//最后实在是想不出来什么好的方法,借鉴别人的,豁然开朗,只要对每一个A的前后进行P与T的计数,用A前P的数量*A后T的数量,即可得到由此A可以构建的所有PAT的数量
//因此最后只用对整个数组进行两次循环即可
#include<iostream>
#include<string>
using namespace std;
int main()
{
string pat;
cin >> pat;
long long count = 0, count_p = 0, count_t = 0;//注意要使用long long类型,不然乘法的时候有可能越界
for (int i = 0; i < pat.size(); i++)//首先计算总共有多少个T
{
if (pat[i] == 'T')count_t++;
}
for (int i = 0; i < pat.size(); i++)//对每一个A进行遍历,计算前面多少个P,后面多少个T
{
if (pat[i] == 'P')count_p++;//前面有P就增加
if (pat[i] == 'T')count_t--;//前面有T证明后面的T的个数要减少
if (pat[i] == 'A')count += count_p*count_t;//A可以构建的所有PAT的计数
}
cout << count % 1000000007;//总的个数需要对1000000007取余数
return 0;
}