http://acm.hdu.edu.cn/showproblem.php?pid=5968
因为长度只有100,那么就可以先暴力预处理所有长度的异或和
记录结果和长度即可。
#include<bits/stdc++.h>
using namespace std;
struct node{
int ans;
int l;
}p[11111];
int main(){
int t;
cin>>t;
while(t--)
{
int n,m;
int a[1111];
int js=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
p[js].ans=a[i];
p[js++].l=1;
for(int j=i+1;j<n;j++)
{
p[js].ans=a[j]^p[js-1].ans;
p[js++].l=j-i+1;
}
}
cin>>m;
int x;
while(m--)
{
cin>>x;
int an=10255;
int id=0;
for(int i=0;i<js;i++)
{
if(abs(p[i].ans-x)<an)
{
an=abs(p[i].ans-x);
id=p[i].l;
}
else if(abs(p[i].ans-x)==an)
{
id=max(id,p[i].l);
}
}
cout<<id<<endl;
}
cout<<endl;
}
return 0;
}
本文介绍了解决HDU 5968问题的一种算法,通过预处理所有子数组的异或和来快速响应查询。使用C++实现,先暴力计算不同长度下数组的所有可能异或和,并记录结果及其对应的子数组长度。当接收到查询时,找到最接近目标值的异或和,同时返回对应的最长子数组长度。

被折叠的 条评论
为什么被折叠?



