蓝桥杯 之 位运算

[复制链接]
发表于 2025-10-19 21:46:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

  • 在蓝桥杯当中,当数字很大的时间,我们就得相对应转化一下数字的表现情势
异或和之和

异或和之和

   思绪分析:
  

  • 由于数据的范围非常大,最大的数字是                                             2                            20                                       2^{20}                  220,以是得思量利用二进制的情势举行表现
  1. n = int(input())
  2. a = [int(x) for x in input().split()]
  3. ans = 0
  4. for k in range(21):            # 所有a不超过20位
  5.     zero, one = 1, 0           # 统计第k位的0和1的数量
  6.     cnt, sum = 0, 0            #cnt用于统计第k位有多少对si⊕sj =1
  7.     for i in range(n):
  8.         v = (a[i] >> k) & 1    # 取a[i]的第k位
  9.         sum ^= v               # 对所有a[i]的第k位做异或得到sum,sum等于0或者1
  10.         if sum == 0:           # 前缀和为0
  11.             zero += 1          # 0的数量加1
  12.             cnt += one         # 这次sum=0,这个sum跟前面等于1的sum异或得1
  13.         else:                  # 前缀异或为1
  14.             one += 1           # 1的数量加1
  15.             cnt += zero        # 这次sum=1,这个sum跟前面等于0的sum异或得1
  16.     ans += cnt * (1 << k)      # 第k位的异或和相加
  17. print(ans)
复制代码


  • 增补一个通例做法,时间复杂度是                                   o                         (                                   n                            2                                  )                              o(n^2)                  o(n2)
  1. import os
  2. import sys
  3. # 请在此输入您的代码
  4. # 1,2,3,4,5
  5. # 异或和可以用这个前缀和的思想
  6. n = int(input())
  7. num = list(map(int,input().split()))
  8. pre = [0]*(n+1)
  9. for i in range(n):
  10.   pre[i+1] = pre[i]^num[i]
  11. ans = 0
  12. for i in range(1,n+1):
  13.   for j in range(i,n+1):
  14.     tmp = pre[j] ^ pre[i-1]
  15.     ans+=tmp
  16. print(ans)
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表