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

为帮助大家能在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()); }
    }
}

猜你喜欢

转载自blog.csdn.net/feng8403000/article/details/125032304