字典存储源代码:
关于上一篇文章,我使用了字典的存储方法进行计数,具体代码如下(完整代码请查阅上一篇内容"python解决异或森林问题"):
for i in range(150):
xor = i * i
dic = {}
dic[0] = 1
for r in range(1 , n + 1):
ans += dic.get(xor ^ pfx_a[r] , 0)
dic[pfx_a[r]] = dic.get(pfx_a[r] , 0) + 1
存储思路:
相比于传统的两重循环使得pfx_a[l]^pfx_a[r] == xor , 现在这种方式只需要单重循环且字典的查询时间复杂度为O(1) , 因此速度更快。
具体思路是 , 每次寻找平方数时我们都新建一个字典,覆盖掉先前的内容,因为平方数之间的计数是独立的,然后初始化字典第一个,即dic[0] = 1,为什么要初始化dic[0] = 1呢?因为当我们pfx_a[r]^xor == 0时,代表的是pfx_a[r]的值等于xor的值,而此时原异或的区间为从第一个数直异或到第r个数,代表区间[1,r],因此要初始化dic[0] = 1.
接下来一层循环遍历,通过get函数查询xor ^ pfx_a[r]的键是否存在,也就是说查询有无一个区间pfx[l]使得pfx[l] ^ pfx_a[r] == xor,完成了这个查询之后再将当前的区间值 + 1存入字典中,由此便可得到使用字典存储并且查询的目的。
如果有讲述不清的地方或者错误,以及你认为的实际意义,我们可以在评论区讨论。