这道题,我一开始的答题思路基本正确,就是前缀XOR数组(听着很厉害其实很简单)+暴力枚举,但是这道题还是WA了,原因是有一些细节没搞清楚,我记得在不久前的博客中写到了自己犯过同样的错误,唉。。。真的是不长记性,在这里再说一下,一定要注意题意中给你的优先级,是现以最大值为基准,还是先以最长子序列为基准,第二优先级是随着第一优先级的改变而改变的,当第一优先级相等时,才会考虑第二优先级的大小,这一点非常的重要。
本题所用到的知识点:
1、a^a^b=b, 0^b=b, A^A=0.(所以可以使用前缀)
2、^运算符优先级是小于‘ - ’的所以要使用括号。 各个运算符的优先级
题目链接:https://vjudge.net/problem/HDU-5968
下面给出AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100+10;
const int INF=0x3f3f3f3f;
int a[maxn],pre[maxn];
int main()
{
int T; scanf("%d",&T);
while(T--)
{
int n; scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
pre[0]=0;
for(int i=1;i<=n;i++)
{
pre[i]=pre[i-1]^a[i];
}
// for(int i=1;i<=n;i++)
// cout<<pre[i]<<" ";
// cout<<endl;
int m; scanf("%d",&m);
while(m--)
{
int re; scanf("%d",&re);
int minn=INF,len=-1;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
int t=abs((pre[j]^pre[i-1])-re);
if(minn>t)
{
minn=t;
len=j-i+1;
}
else if(minn==t)
{
len=max(len,j-i+1);
}
}
}
printf("%d\n",len);
}
printf("\n");
}
return 0;
}