给定长为 n 的数组 a,下标从 1 计算。给定整数 k。记 \oplus 表示按位异或,\oplus_{1\le j\le i}a_j 表示 a_1\oplus a_2\oplus\cdots\oplus a_i。求: \max_{k\le s\le n,s\le r\le n}\min_{r-s+1\le i\le r}\oplus_{1\le j\le i}a_j 即求所有长度至少为 k 的区间 [r-s+1,r] 里每个区间异或和最小值的最大值。
未经优化的伪代码为:
ans = 0;
for (int s = k; s <= n; ++s) {
for (int r = s; r <= n; ++r) {
min_v = 2e9;
for (int i = r - s + 1; i <= r; ++i) {
xsum = 0;
for (int j = 1; j <= i; ++j) {
xsum ^= a[j];
}
min_v = min(min_v, xsum);
}
ans = max(ans, min_v);
}
}
输入
输入一行两个整数 n,k(2\le n\le 2\times10^6,2\le k\le n)。
接下来输入一行 n 个整数,第 i 个整数代表 a_i(0\le a_i\le 10^9)。
输出
输出一行一个整数,代表答案。
样例
标准输入 复制文本 |
8 2 0 1 1 2 6 5 2 7 |
标准输出 复制文本 |
3 |
来源
2022CS杯预选赛