补充异或森林字典计数内容

字典存储源代码:

        关于上一篇文章,我使用了字典的存储方法进行计数,具体代码如下(完整代码请查阅上一篇内容"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存入字典中,由此便可得到使用字典存储并且查询的目的。

如果有讲述不清的地方或者错误,以及你认为的实际意义,我们可以在评论区讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岚小风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值