蓝桥杯官网 试题 PREV-267 历届真题 异或数列【第十二届】【省赛】【研究生组】【C++】【Java】两种解法

举报
红目香薰 发表于 2022/05/31 18:37:55 2022/05/31
1.1k+ 0 0
【摘要】 ​ 为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。今年的最大目标就是能为【一亿技术人】创造更高的价值。资源限制内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s​编辑​编辑C++#include <stdio.h>#include <math...

 为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。

今年的最大目标就是能为【一亿技术人】创造更高的价值。


资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

编辑编辑

C++

#include <stdio.h>
#include <math.h>

int T, S, n, A[200010];

int main() {
    scanf("%d", &T);
    while (T--) {
        S = 0;
        scanf("%d", &n);
        for (int i = 0; i < n; ++i)
        	scanf("%d", &A[i]), S ^= A[i];
        if (S) {
            int k = log2(S), a = 0;
            for (int i = 0; i < n; ++i) if (A[i] >> k & 1) ++a;
            if (n & 1 || a == 1) printf("1\n");
            else printf("-1\n");
        } else printf("0\n");
    }
}

Java

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {

    public static void main(String[] args) { new Main().run(); }

    void run() {
        InputReader in = new InputReader(System.in);
        PrintWriter out = new PrintWriter(System.out);
        int T = in.readInt(), S, n, a;
        int[] A = new int[21];
        while (T-- > 0) {
            S = 0;
            n = in.readInt();
            Arrays.fill(A, 0);
            boolean flag = (n & 1) == 1;
            while (n-- > 0) {
                S ^= a = in.readInt();
                for (int i = 0; i <= 20; i++)
                    if ((a >> i & 1) == 1) A[i]++;
            }
            if (S == 0) out.println("0");
            else if (A[floorLog2(S)] == 1 || flag) out.println("1");
            else out.println("-1");
        }
        out.flush();
    }

    int highBit(int a) {
        a |= a >> 1;
        a |= a >> 2;
        a |= a >> 4;
        a |= a >> 8;
        a |= a >> 16;
        return a - (a >>> 1);
    }

    int[] FLOOR_LOG2_TABLE = { 0, 0, 1, 26, 2, 23, 27, 32, 3, 16, 24, 30, 28, 11, 33, 13, 4, 7, 17, 35, 25, 22, 31, 15, 29, 10, 12, 6, 34, 21, 14, 9, 5, 20, 8, 19, 18 };

    int floorLog2(int a) { return FLOOR_LOG2_TABLE[highBit(a) % 37]; }

    class InputReader {

        BufferedReader reader;
        StringTokenizer token;

        InputReader(InputStream in) {
            this.reader = new BufferedReader(new InputStreamReader(in));
        }

        String read() {
            while (token == null || !token.hasMoreTokens()) {
                try {
                    token = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return token.nextToken();
        }

        int readInt() { return Integer.parseInt(read()); }
    }
}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。