输入的时候记录异或前缀,查询的时候枚举区间的起点和终点,这段区间的异或值就是sum[j]^sum[i-1](类似前缀和)然后更新最优答案。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 105;
int num[maxn];
int sum[maxn];
int main()
{
int cases,n,m;
scanf("%d",&cases);
while(cases--)
{
scanf("%d",&n);
sum[0] = 0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
sum[i] = sum[i-1]^num[i];
}
//for(int i=1;i<=n;i++) printf("%d ",sum[i]); printf("\n");
scanf("%d",&m); int q;
while(m--)
{
scanf("%d",&q);
int len=1<<20; int c = 1<<20;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
// printf("%d %d ",abs(sum[j]^sum[i-1]-q),j-i+1);
if(c>abs((sum[j]^sum[i-1])-q))
{
c = abs((sum[j]^sum[i-1])-q);
len = j-i+1;
}
else if(c==abs((sum[j]^sum[i-1])-q))
{
if(len<(j-i+1)) len = j-i+1;
}
}
//printf("\n");
}
printf("%d\n",len);
}
printf("\n");
}
return 0;
}