<p>我看到您的代码有很多小问题,但不能说它们是否会导致严重的性能问题:</p>
<p>您的<code>defaultdict()</code>设置和使用不正确:</p>
^{1}$
<p><code>defaultdict()</code>构造函数的参数应该是值的类型,而不是键的类型。正确设置defaultdict后,只需执行以下操作:</p>
^{pr2}$
<p>因为如果模式不存在,那么该值现在将默认为零。在</p>
<p>因为说明书上说:</p>
<blockquote>
<p> - ai — delete a single occurrence of non-negative integer ai from the multiset. It's guaranteed, that there is at least one ai in the
multiset.</p>
</blockquote>
<p>那么这个:</p>
<pre><code>pat[pattern] = max( pat[pattern] - 1, 0)
</code></pre>
<p>可以是这样:</p>
<pre><code>pat[pattern] -= 1
</code></pre>
<p>但是你可以用小于18的字符串,因为你可以用小于18的字符串。在</p>
<p><code>getSPattern()</code>执行一个<code>zfill()</code>然后处理字符串,它应该以相反的顺序执行,处理字符串,然后<code>zfill()</code>它,因为不需要在前导零上运行逻辑。在</p>
<p>我们不需要<code>int()</code>的开销来将字符转换为数字:</p>
<pre><code>(int(news[i])%2 == 0)
</code></pre>
<p>考虑使用<code>ord()</code>,因为数字的ASCII值与数字本身具有相同的奇偶校验:<code>ord('4')</code>->;52</p>
<p>而且不需要循环索引,只需循环字符即可。在</p>
<p>下面是我对你的代码进行的修改,看看它是否仍然有效(!)为你带来任何表现:</p>
<pre><code>from collections import defaultdict
def getPattern(string):
return string.zfill(18)
def getSPattern(string):
# pattern_list = (('0', '1')[ord(character) % 2] for character in string)
pattern_list = ('0' if ord(character) % 2 == 0 else '1' for character in string)
return ("".join(pattern_list)).zfill(18)
patterns = defaultdict(int) # holds keys as strings as and values as int
text = int(raw_input())
for _ in range(text):
operation, number = raw_input().strip().split()
if operation == '+':
pattern = getSPattern(number)
patterns[pattern] += 1
elif operation == '-':
pattern = getSPattern(number)
patterns[pattern] -= 1
elif operation == '?':
print patterns.get(getPattern(number), 0)
</code></pre>