我最近用dictoionaries编写了一个python解决方案,得到了很好的结论。这个解决方案完全类似于c++中的多集解决方案。因此,我们确信逻辑是正确的,但是实现还没有达到目标。在
理解以下代码(http://codeforces.com/contest/714/problem/C)的问题描述:
有什么提示/指针可以提高以下代码的性能?它给出了大型测试用例(http://codeforces.com/contest/714/submission/20594344)的TLE(超过时间限制)。在
from collections import defaultdict
def getPattern(s):
return ''.join(list(s.zfill(19)))
def getSPattern(s):
news = s.zfill(19)
patlist = [ '0' if (int(news[i])%2 == 0) else '1' for i in range(19) ]
return "".join(patlist)
t = int(raw_input())
pat = defaultdict(str) # holds strings as keys and int as value
for i in range(0, t):
oper, num = raw_input().strip().split(' ')
if oper == '+' :
pattern = getSPattern(str(num))
if pattern in pat:
pat[pattern] += 1
else:
pat[pattern] = 1
elif oper == '-' :
pattern = getSPattern(str(num))
pat[pattern] = max( pat[pattern] - 1, 0)
elif oper == '?' :
print pat.get(getPattern(num) , 0 )
由于@cdlane已经做了解释,我只需要添加对
^{1}$getSPattern
的重写,我认为大部分时间都花在这里了。根据我最初的评论,这可以在https://eval.in/641639上找到使用zfill(18)可能会稍微节省一些时间。在
我看到您的代码有很多小问题,但不能说它们是否会导致严重的性能问题:
您的
^{1}$defaultdict()
设置和使用不正确:
^{pr2}$defaultdict()
构造函数的参数应该是值的类型,而不是键的类型。正确设置defaultdict后,只需执行以下操作:因为如果模式不存在,那么该值现在将默认为零。在
因为说明书上说:
那么这个:
可以是这样:
但是你可以用小于18的字符串,因为你可以用小于18的字符串。在
getSPattern()
执行一个zfill()
然后处理字符串,它应该以相反的顺序执行,处理字符串,然后zfill()
它,因为不需要在前导零上运行逻辑。在我们不需要
int()
的开销来将字符转换为数字:考虑使用
ord()
,因为数字的ASCII值与数字本身具有相同的奇偶校验:ord('4')
->;52而且不需要循环索引,只需循环字符即可。在
下面是我对你的代码进行的修改,看看它是否仍然有效(!)为你带来任何表现:
相关问题 更多 >
编程相关推荐