1040 有几个PAT (25 分)
字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT 是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过10510^5105,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
题解
这个题最初思路为:假设某个A的前面字母P的个数a和A的后面字母T的个数b,a*b是当前A位置PAT的个数,分别统计每个A的情况。然后惊奇发现超时。。。
转变策略,先查出所有T 的量,然后开始遍历,时刻更新已出现P的量,且出现过 的T要减掉,遇到A就计算A的量和P的量相乘然后累加即可。
从运算速度上看好像switch比if快一些,因为switch只需要取出一次变量,然后进行多次比较操作;而if每一次比价都需要取出变量就会慢一些,当然这个题if也可以通过。
测试点3、测试点4如果不过,记得要对输出 取1000000007余数
AC例程
switch的写法
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
string str;
int countT=0,countP=0;
long long sum=0;
getline(cin,str);
for(int i=0;i<str.length();i++)
if(str[i]=='T')++countT;
for(int i=0;i<str.length();i++)
switch (str[i]) {
case 'P':++countP;break;
case 'T':--countT;break;
case 'A':sum += countP * countT;break;
}
cout<<sum%1000000007<<endl;
return 0;
}
if的写法
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
string str;
int countT=0,countP=0;
long long sum=0;
getline(cin,str);
for(int i=0;i<str.length();i++)
if(str[i]=='T')++countT;
for(int i=0;i<str.length();i++) {
if (str[i] == 'P')++countP;
else if (str[i] == 'T')--countT;
else if (str[i] == 'A')sum += countP * countT;
}
cout<<sum%1000000007<<endl;
return 0;
}