列表

详情


NC214363. 区间异或

描述

有一个长度为 n 的数组 a[i] , 有 m 次询问, 每次询问给一个值 x , 找出一个最短的区间, 使得这个区间的异或和 ≥ x , 输出区间长度。如果找不到输出 -1

输入描述

第一行两个整数 n , m (1 ≤ n ≤ 3000 and 0 ≤ m ≤ 2e5)

第二行 n 个整数 a[i] . (0≤ a[i] ≤ 1e9)

接下来 m 行, 每行一个整数 x , 代表一次询问。 (0 ≤ x ≤ 1e9)

输出描述

每次询问输出满足条件的最短区间,如果找不到输出 -1


示例1

输入:

5 3

16 5 2 8 32

4 

48

33

输出:

1
5
2

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 64ms, 内存消耗: 1008K, 提交时间: 2020-12-07 01:27:17

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int i,j,x,n,m,S[3005]={0},A[3005]={0};
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)scanf("%d",&x),S[i]=S[i-1]^x;
	for(i=1;i<=n;i++)
		for(j=i;j<=n;j++)A[j-i+1]=max(A[j-i+1],S[j]^S[i-1]);
	for(i=2;i<=n;i++)A[i]=max(A[i-1],A[i]);
	while(m--)
	{
		scanf("%d",&x);
		i=lower_bound(A+1,A+1+n,x)-A;
		if(i>n)i=-1;
		printf("%d\n",i);
	}
    return 0;
}

上一题