本题数据较水。
通过前缀和降低所需的枚举操作,将答案打表后搜索即可得到答案。
#include <bits/stdc++.h>
#define sc(x) scanf("%lld", &(x))
#define pr(x) printf("%lld\n", (x))
using namespace std;
typedef long long ll;
inline ll read() {
ll s = 0, f = 1;
char ch;
do {
ch = getchar();
if (ch == '-') f = -1;
} while (ch < 48 || ch > 57);
while (ch >= 48 && ch <= 57)
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return s * f;
}
ll n, m, a[3005], x, s[3005];
ll res[3005]; // res[i]表示i个数能够凑到的最大值
int main() {
n = read(), m = read();
for (int i = 1; i <= n; ++i) a[i] = read();
s[1] = a[1]; //异或前缀和
for (int i = 1; i <= n; ++i) s[i] = s[i - 1] ^ a[i];
for (int i = 1; i <= n; ++i) //枚举每一种取值
for (int len = 1; i + len - 1 <= n; ++len)
res[len] = max(res[len], s[len + i - 1] ^ s[i - 1]);
for (int i = 2; i <= n; ++i) res[i] = max(res[i - 1], res[i]);
while (m--) {
x = read();
int t = lower_bound(res + 1, res + n + 1, x) - res;
pr(t > n ? -1LL : t);
}
return 0;
} 
京公网安备 11010502036488号