比赛 期末考试4 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 区间消除 最终得分 100
用户昵称 xuyuqing 运行时间 3.670 s
代码语言 C++ 内存使用 4.07 MiB
提交时间 2026-02-12 10:32:28
显示代码纯文本

#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

constexpr int N = 11451;

int q;
int n;
long long a[N];
long long sum[N];
long long dp[N][2];
long long res[N];

long long highbit (long long num) {
	num |= (num >> 1);
	num |= (num >> 2);
	num |= (num >> 4);
	num |= (num >> 8);
	num |= (num >> 16);
	num |= (num >> 32);

	if (num == 0) {
		return (1ll << 62);
	}

	return num - (num >> 1);
}

long long xorCal (int i, int j) {
	long long cal = sum[j] ^ sum[i - 1];
	if (cal == 0) {
		return (1ll << 62);
	}
	return cal;
}

int main () {

	freopen ("dump.in", "r", stdin);
	freopen ("dump.out", "w", stdout);
\
	scanf ("%d", &q);
	for (int index = 1; index <= q; index++) {
		scanf ("%d", &n);
		for (int i = 1; i <= n; i++) {
			scanf ("%lld", &a[i]);
			sum[i] = sum[i - 1] ^ a[i];
		}

		if (n == 1) {
			printf ("1\n");
			continue;
		}

		memset (dp, 0, sizeof (dp));
		dp[1][0] = highbit (sum[n]);
		dp[n][1] = highbit (sum[n]);
		for (int len = n - 1; len >= 1; len--) {
			for (int i = 1, j = i + len - 1; j <= n; i++, j++) {
				long long cal = xorCal (i, j);
				long long flag = ((cal | (1ll << 62)) & dp[i][0]) | ((cal | (1ll << 62)) & dp[j][1]);

				if (flag) {
					dp[i][0] |= highbit (cal);
					dp[j][1] |= highbit (cal);
				}

				if (len == 1) {
					res[i] = bool (flag);
				}
			}
		}

		for (int i = 1; i <= n; i++) {
			printf ("%lld", res[i]);
		}
		printf ("\n");
	}

	return 0;
}