字符串 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
代码长度限制
16 KB
时间限制
150 ms
内存限制
64 MB
【代码 —— 版本一】
这题自己写的版本比较麻烦,后文有参考别人的版本。
#include <iostream>
#include <string>
using namespace std;
struct pat
{
long long p_left;
long long t_right;
};
int main()
{
string str;
cin >> str;
pat* arr;
long long p_time = 0;
long long t_time= 0;
long long a_time= 0; //第一次遍历用来统计一共几个A,第二次遍历用来表明这是第几个A
long long i = 0;
for (i = 0; i < str.size(); i++)
{
if (str[i] == 'A')
{
a_time++;
}
}
arr = new pat[a_time];
a_time = 0;
for (i = 0; i < str.size(); i++)
{
if (str[i] == 'P')
p_time++;
else if (str[i] == 'A')
{
arr[a_time++].p_left = p_time; //统计每个A左边有几个P
}
}
long long sum = 0; //计算PAT总数
a_time--;
for (i = str.size() - 1; i >= 0; i--)
{
if (str[i] == 'T')
t_time++;
else if (str[i] == 'A')
{
arr[a_time].t_right = t_time; //统计每个A右边有几个T
sum = (sum+arr[a_time].p_left * arr[a_time].t_right)%1000000007;
a_time--;
}
}
cout << sum << endl;
delete[] arr;
return 0;
}
【代码——版本2】
逐字符读入,统计T总数
一轮遍历,统计每个A左侧P总数和右侧T总数(左侧遇到一次T就减一次T总数,得到右侧T总数)
#include <iostream>
#include <string>
using namespace std;
int main()
{
char arr[100001] = { 0 };
int i = 0;
int p_time = 0;
int t_time = 0;
int a_time = 0;
int a_count = 0;
long sum = 0;
while ((arr[i] = cin.get())!='\n')
{
if (arr[i++] == 'T')
t_time++;
}
arr[i] = '\0';
i = 0;
while (arr[i])
{
if (arr[i] == 'P')
p_time++;
else if (arr[i] == 'A')
sum = (sum + p_time * t_time) % 1000000007;
else if (arr[i] == 'T')
t_time--;
i++;
}
cout << sum << endl;
return 0;
}