字符串 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只占三个字母,所以关键是找到A,然后再数A前面的P和A后面的T的个数,两数相乘,这样就可以得到每个A所能表示的PAT的个数。
注意最后的取余,记得不能用+=,要写全再取余。。不然会有两个错误。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
string str;
cin >> str;
int n = str.length();
vector<int> P(n, 0);
vector<int> T(n, 0);
int cntp = 0, cntt = 0;
for (int i = 0; i < n;i++)
{
if(str[i] == 'P')
{
cntp++;
P[i] = cntp;
}else
P[i] = cntp;
if(str[n-i-1] == 'T')
{
cntt++;
T[n - i - 1] = cntt;
}else
T[n - i - 1] = cntt;
}
int sum = 0;
for (int i = 0;i<n;i++)
{
if(str[i] == 'A')
sum = (sum + P[i] * T[i]) % 1000000007;
}
cout << sum;
return 0;
}