1040 有几个PAT(25)(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
作者: CAO, Peng
单位: PAT联盟
时间限制: 120ms
内存限制: 64MB
代码长度限制: 16KB
问题分析:
这题打眼一看,说是要 “对1000000007取余数”,这计算量肯定不小
(可达鸭眉头一皱,发现事情并不简单)
常规思路
代码:
n = input()
count = 0
for i in range(len(n)):
if n[i] == 'P':
for j in range(i + 1, len(n)):
if n[j] == 'A':
for x in range(j + 1, len(n)):
if n[x] == 'T':
count += 1
print(count % 1000000007)
果然后三个节点超时,然而以博主的智商,实在不知道怎么怎么优化算法
有幸翻到大佬的微博:
https://blog.csdn.net/ice_camel/article/details/44263451
但是有一点不是很明白,不知道为什么大佬要从后往前读字符串,这点稍微有所修改,也可通过
改进代码:
n = input()
count_P = count_PA = count_PAT = 0
for i in n:
if 'P' == i:
count_P += 1
elif 'A' == i:
count_PA += count_P
else:
count_PAT += count_PA
print(count_PAT % 1000000007)