第十四届蓝桥杯省赛 C/C++ A 组 H 题——异或和之和(AC)

这篇具有很好参考价值的文章主要介绍了第十四届蓝桥杯省赛 C/C++ A 组 H 题——异或和之和(AC)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 异或和之和

1.题目描述

给定一个数组 A i A_i Ai,分别求其每个子段的异或和,并求出它们的和。或者说,对于每组满足 1 ≤ L ≤ R ≤ n 1 \leq L \leq R \leq n 1LRn L , R L, R L,R,求出数组中第 L L L 至第 R R R 个元素的异或和。然后输出每组 L , R L, R L,R 得到的结果加起来的值。

2.输入格式

输入的第一行包含一个整数 n n n

第二行包含 n n n 个整数 A i A_i Ai,相邻整数之间使用一个空格分隔。

3.输出格式

输出一行包含一个整数表示答案。

4.样例输入

5
1 2 3 4 5

5.样例输出

39

6. 数据范围

对于 30 % 30\% 30% 的评测用例, n ≤ 300 n \leq 300 n300

对于 60 % 60\% 60% 的评测用例, n ≤ 5000 n \leq 5000 n5000

对于所有评测用例, 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105 0 ≤ A i ≤ 2 20 0 \leq A_i \leq 2^{20} 0Ai220

7. 原题链接

异或和之和

2. 解题思路

首先,根据题意进行暴力枚举每个子区间 [ l , r ] [l,r] [l,r] ( 1 ≤ l ≤ r ≤ n ) (1\leq l \leq r \leq n) (1lrn) 的异或和,复杂度将是 O ( n 2 ) O(n^2) O(n2),无法通过本题,但可以拿到一定分数。

因为涉及异或运算且观察到 a i a_i ai 的取值范围为 [ 0 , 2 20 ] [0,2^{20}] [0,220],我们不难想到从"拆位"的角度去思考问题。假设对于二进制位的第 i ∈ [ 0 , 20 ] i \in[0,20] i[0,20] 位,数组中一共有 x x x 个子区间在该位的异或和为 1 1 1,那么该位对答案的贡献为 2 i × x 2^{i} \times x 2i×x。这样我们就将整个大问题,拆成了 20 20 20 个子问题,原数组相当于被我们拆分为 20 20 20 01 01 01 数组。

对于每个子问题,也就是对于每个 01 01 01 数组,我们需要求出有多少子数组的异或和为 1 1 1,也就是求出前面所说的 x x x。这个问题我们可以通过前缀异或来解决。设这里的 01 01 01 数组为 a a a 数组,我们再设一个 S S S 数组, S i S_i Si 表示 a a a 数组中前 i i i 个元素的异或和为多少。根据异或运算的性质:

a i ⊕ a i + 1 ⊕ ⋯ ⊕ a j − 1 ⊕ a j = ( a 1 ⊕ a 2 ⊕ ⋯ a j ) ⊕ ( a 1 ⊕ a 2 ⊕ ⋯ ⊕ a i − 1 ) a_i \oplus a_{i+1} \oplus \cdots \oplus a_{j-1} \oplus a_j=(a_1 \oplus a_2 \oplus \cdots a_j) \oplus (a_1 \oplus a_2 \oplus \cdots \oplus a_{i-1}) aiai+1aj1aj=(a1a2aj)(a1a2ai1)

将上述式子用 S S S 进行代替有:

a i ⊕ a i + 1 ⊕ ⋯ ⊕ a j − 1 ⊕ a j = S i − 1 ⊕ S j a_i \oplus a_{i+1} \oplus \cdots \oplus a_{j-1} \oplus a_j=S_{i-1} \oplus S_j aiai+1aj1aj=Si1Sj

如果想使得等式左边等于 1 1 1,即需要满足 S i − 1 ≠ S j S_{i-1} \ne S_j Si1=Sj

根据上述分析,我们可以枚举每个 01 01 01 数组的前缀异或数组 S S S,当我们枚举到 S j S_j Sj 时,我们只需要考虑在它之前有多少个 S i S_i Si 和它不同,不同的个数就等于以 a j a_j aj 结尾且异或和为 1 1 1 的子数组个数,这个统计个数的功能我们可以使用哈希表实现。

这样我们可以在接近 O ( n ) O(n) O(n) 的复杂度统计出每个 01 01 01 数组子区间异或为 1 1 1 的个数,我们设第 i i i 个二进制位的 01 01 01 数组子区间异或为 1 1 1 的个数为 b i b_i bi,最终答案为:

∑ i = 0 20 2 i × b i \sum_{i=0}^{20} 2^{i} \times b_i i=0202i×bi

时间复杂度: O ( 20 × n ) O(20 \times n) O(20×n)文章来源地址https://www.toymoban.com/news/detail-640318.html

3. AC_Code

  • C++
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 100010;

int n;
int a[N][25];
int main()
{
	ios_base :: sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		int x;
		cin >> x;
		for (int j = 0; j <= 20; ++j) {
			a[i][j] = (x >> j) & 1;
			a[i][j] ^= a[i - 1][j];
		}
	}
	LL ans = 0;
	for (int j = 0; j <= 20; ++j) {
		map<int, int> m;
		m[0]++;
		for (int i = 1; i <= n; ++i) {
			int x = m[a[i][j] ^ 1];
			ans += 1LL * (1 << j) * x;
			m[a[i][j]]++;
		}
	}
	cout << ans << '\n';
	return 0;
}
  • Java
import java.util.*;

public class Main {
    static final int N = 100010;

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[][] a = new int[N][25];
        for (int i = 1; i <= n; ++i) {
            int x = scan.nextInt();
            for (int j = 0; j <= 20; ++j) {
                a[i][j] = (x >> j) & 1;
                a[i][j] ^= a[i - 1][j];
            }
        }
        long ans = 0;
        for (int j = 0; j <= 20; ++j) {
            Map<Integer, Integer> m = new HashMap<>();
            m.put(0, 1);
            for (int i = 1; i <= n; ++i) {
                int x = m.getOrDefault(a[i][j] ^ 1, 0);
                ans += (1L << j) * x;
                m.put(a[i][j], m.getOrDefault(a[i][j], 0) + 1);
            }
        }
        System.out.println(ans);
    }
}
  • Python
n = int(input())
N = 100010
a = [[0] * 25 for _ in range(N)]
b = list(map(int, input().split()))
for i in range(1, n + 1):
    x = b[i-1]
    for j in range(21, -1, -1):
        a[i][j] = (x >> j) & 1
        a[i][j] ^= a[i - 1][j]
ans = 0
for j in range(21, -1, -1):
    m = {0: 1}
    for i in range(1, n + 1):
        x = m.get(a[i][j] ^ 1, 0)
        ans += (1 << j) * x
        m[a[i][j]] = m.get(a[i][j], 0) + 1
print(ans)

到了这里,关于第十四届蓝桥杯省赛 C/C++ A 组 H 题——异或和之和(AC)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十四届蓝桥杯省赛 Python B 组 D 题——管道(AC)

    有一根长度为 len text{len} len 的横向的管道,该管道按照单位长度分为 len text{len} len 段,每一段的中央有一个可开关的阀门和一个检测水流的传感器。 一开始管道是空的,位于 L i L_i L i ​ 的阀门会在 S i S_i S i ​ 时刻打开,并不断让水流入管道。 对于位于 L i L_i L i ​ 的阀

    2024年02月07日
    浏览(32)
  • 第十四届蓝桥杯省赛JavaB组试题E【蜗牛】个人题解Dijkstra堆优化

                                                                                     🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝                                               第十四届蓝桥杯省赛JavaB组试题E【蜗牛】Dijkstra堆

    2023年04月15日
    浏览(33)
  • 第十三届蓝桥杯省赛与国赛真题题解大汇总(十四届参赛者必备)

      大家好,我是执梗。本文汇总了我写的第十三届蓝桥杯所有省赛真题与国赛真题,会针对每道题打出我自己的难度评星⭐️,也会给出每道题的算法标签,帮助大家更有针对性的去学习和准备,当然许多题目由于难度或时间的原因暂未更新,如果有不懂的问题也可以在评

    2024年02月11日
    浏览(66)
  • 第十四届蓝桥杯省赛JavaB组试题E【蜗牛】Dijkstra堆优化 or 线性DP?

                                                                                     🍏🍐🍊🍑🍒🍓🫐🥑🍋🍉🥝                                               第十四届蓝桥杯省赛JavaB组试题E【蜗牛】Dijkstra堆

    2024年02月01日
    浏览(36)
  • 十四届蓝桥杯省赛CB

    写的时候没跑出来,仅仅是因为给 (i*i) 加了括号,爆了int!!! 双精度浮点的表示范围:-1.79E+308 ~ +1.79E+308 基本类型:int 二进制位数:32(4字节) 最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方) 最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1 double范围很大,基本不可能爆,不

    2024年02月08日
    浏览(30)
  • 2023年第十四届蓝桥杯省赛Java C组题解

    只做出来(ACDFGH),挑几个出来,答案不一定正确,但自己测试通过了 求1~20230408的和 这里就直接套等差数列的求和公式,答案:204634714038436   【问题描述】         有一个长度为n的数组(n是10的倍数),每个数 Ai 都是区间[0,9]中的整数,小明发现数组里每种数出现的次数不太

    2023年04月26日
    浏览(31)
  • 第十四届蓝桥杯Python B组省赛复盘

    【问题描述】(5 分) 请求出在 12345678 至 98765432 中,有多少个数中完全不包含 2023 。 完全不包含 2023 是指无论将这个数的哪些数位移除都不能得到 2023 。 例如 20322175,33220022 都完全不包含 2023,而 20230415,20193213 则 含有 2023 (后者取第 1, 2, 6, 8 个数位) 。 【思路】 正则表达

    2024年02月02日
    浏览(40)
  • 蓝桥杯嵌入式第十四届省赛题目解析

    前几天刚刚参加完第十四届的省赛,这届题目比我想象中的要难,其实想一想这也是应该的,以前的知识点都被摸透了,也是需要加入新的知识点了,但是我还是想说能不能别在我参加的时候加大题目难度啊。 不过听说隔壁单片机的省赛都比往年的国赛还难,这就有点离谱了

    2024年02月06日
    浏览(35)
  • 第十四届蓝桥杯大赛软件赛省赛JavaB组解析

    目录 说在前面 试题 A: 阶乘求和 代码: 题目分析: 试题 B: 幸运数字 代码: 题目分析: 试题 D: 矩形总面积 代码: 题目分析: 试题 G: 买二赠一 代码: 题目分析: 试题 H: 合并石子 代码: 题目思路: 说在最后 比赛结束啦,可能这是本科生涯的最后一次蓝桥杯啦!赛前也

    2023年04月11日
    浏览(30)
  • 蓝桥杯单片机第十四届省赛题目和程序答案

    目录  1、前言  2、题目 3、程序架构     3.1 display.c    3.2 ds1302.c    3.3 iic.c    3.4 onewire.c    3.5 main.c 主函数文件    3.6 环境配置 4. 历年蓝桥杯单片机试题和答案        抽空复习了一下,拿下单片机省赛一等奖,在此分享一下最新的14届省赛程序设计答案          模

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包