1040 有几个PAT(25 分)
字符串 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
我把sum的类型从int 换成long long,才过了最后两个测试点,应该是sum最后的范围超过了int的范围吧。 这道题的时间限制是150ms,比其他题还少了250ms。想来要在算法上下点心思。尽量不要用循环套循环,而且减少遍历数据的次数,不然在数据非常大的时候很容易造成超时。这道题我想着遍历数据,找到A之后,再找前面的P的个数和后面的T的个数,两者相乘结果加到sum里面,重复这个过程得到结果。刚开始我循环套循环实现了这个想法,毫无意外地超时了。想了一下如何减少遍历数据的次数,得到下面的代码。
参考代码:
#include<string>
#include<iostream>
using namespace std;
int main()
{
string str1;
cin >> str1;
int n = str1.size();
long long sum=0;
int flag1 = 0,num1=0,num2=0;
for (int i = 0; i < n; i++)
{
if (str1[i] == 'A')
{
flag1 = i;
for (int j = i + 1; j < n; j++)
if (str1[j] == 'T')
num2++;
break;
}
}
for (int i = 0; i < n; i++)
{
if (str1[i] == 'P')
num1++;
if (str1[i] == 'T'&&i>flag1)
num2--;
if (str1[i] == 'A')
sum = sum + (num1*num2);
}
cout << sum % 1000000007 << endl;
system("pause");
return 0;
}