#include<bits/stdc++.h> //对拍数据
using namespace std;
int f()
{
int x=rand()%2;
if(x==0) return 1;
else return -1;
}
int main()
{
freopen("C:/Users/hzy/Desktop/11.txt","w",stdout);
srand(time(0));
int t;
scanf("%d",&t);
printf("%d\n",t);
while(t--)
{
int n,m;
n=rand()%100+1;
printf("%d ",n);
for(int i=0;i<n;i++) printf("%d ",rand()%1024);cout<<endl;
m=rand()%100+1;
printf("%d ",m);
for(int i=0;i<m;i++) printf("%d ",f()*rand()%1024);cout<<endl;
}
return 0;
}
#include<bits/stdc++.h>//二分模拟
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int n,m;
int a[maxn],b[maxn],s[maxn],d[maxn];
int dis[maxn];
int fabs(int x){return x>0?x:-x;}
struct Node
{
int len,s;
}c[maxn];
bool cmp(Node p,Node q)
{
if(p.s==q.s) {return p.len<q.len;}
return p.s<q.s;
}
int main()
{
//freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
s[0]=0;
for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}//预处理
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
int num=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
c[num].s=s[j]^s[i-1],c[num++].len=j-i+1;//预处理
sort(c,c+num,cmp);
for(int i=0;i<num;i++) d[i]=c[i].s;//临时对应数组
int s=1;
dis[0]=1;
for(int i=1;i<num;i++) //预处理出(距离最右侧与之相等值的距离+1)
{
if(d[i-1]==d[i]) s++;
else s=1;
dis[i]=s;
}
for(int i=num-1;i>=0;) //预处理出(距离最右侧与之相等值的距离+1)
for(int j=dis[i],k=1;j>=1;j--,i--,k++)
dis[i]=k;
for(int i=1;i<=m;i++)
{
int pos=lower_bound(d,d+num,b[i])-d;//无大于b[i]的值返回最后坐标+1
int _pos=pos+dis[pos]-1;//暴力找被tl了
if(pos!=num)
{
if(pos==0)
{
printf("%d\n",c[_pos].len);
continue;
}
if(fabs(d[pos-1]-b[i])<fabs(d[pos]-b[i])) printf("%d\n",c[pos-1].len);
else if(fabs(d[pos-1]-b[i])==fabs(d[pos]-b[i]))
printf("%d\n",max(c[pos-1].len,c[_pos].len));
else printf("%d\n",c[_pos].len);
}
else
{
printf("%d\n",c[pos-1].len);
}
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>//桶标记
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int a[maxn],b[maxn],s[maxn],d[maxn];
int fabs(int x){return x>0?x:-x;}
int main()
{
//freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){ scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
memset(d,-1,sizeof(d));
for(int i=0;i<n;i++)
{
for(int j=i;j<=n;j++)
{
int tmp=s[j]^s[i]; //ai<1024且为非负数,没注意非负,外加对应数值存储负数结果被tle
if(d[tmp]==-1) d[tmp]=j-i;//初始化
else d[tmp]=max(d[tmp],j-i);//更新最大
}
}
for(int i=1;i<=m;i++)
{
if(b[i]<0) b[i]=0; //ai不非负,题目可以改进一下
for(int j=b[i],k=b[i];;j--,k++) //找最近和绝对值差最大的答案
{
if(j<0) j=0;
if(k>1024) k=1024; //最大值1024
if(d[j]!=-1&&d[k]==-1) {printf("%d\n",d[j]);break;}
else if(d[j]==-1&&d[k]!=-1) {printf("%d\n",d[k]);break;}
else if(d[j]!=-1&&d[k]!=-1) {printf("%d\n",max(d[j],d[k]));break;}
}
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>//拼人品的暴力
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int a[maxn],b[maxn],s[maxn],d[maxn];
int fabs(int x){return x>0?x:-x;}
int main()
{
//freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
s[0]=0;
for(int i=1;i<=n;i++){ scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}
int m;
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
for(int k=1;k<=m;k++)
{
int anslen,anss=INF;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
int tmp=fabs((s[j]^s[i-1])-b[k]);
if(tmp<anss)
{
anss=tmp;
anslen=j-i+1;
}
else if(tmp==anss&&(j-i+1)>anslen)
{
anslen=j-i+1;
}
}
printf("%d\n",anslen);
}
printf("\n");
}
return 0;
}
#include<bits/stdc++.h>//再练习下二分
using namespace std;
const int maxn=1e6;
const int INF=2e9;
int n,m;
int a[maxn],b[maxn],s[maxn],d[maxn],f[maxn];
int dis[maxn];
int fabs(int x){return x>0?x:-x;}
struct Node
{
int len,s;
}c[maxn];
bool cmp(Node p,Node q)
{
if(p.s==q.s) {return p.len<q.len;}
return p.s<q.s;
}
int O[maxn];
int X[maxn];
int low(int l,int r,int x)
{
int pos=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(d[mid]<=x) {l=mid+1;pos=mid;}
else r=mid-1;
}
return pos;
}
int high(int l,int r,int x)
{
int tmpl=l,tmpr=r;
int pos=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(d[mid]>=x) {r=mid-1;pos=mid;}
else l=mid+1;
}
if(pos==-1) return -1;
return low(tmpl,tmpr,d[pos]); //返回大于x并距其最近的值的最右边的坐标(没办法再次二分)
}
void solve() //暴力答案对拍用
{
int anslen,anss;
for(int k=1;k<=m;k++)
{
anss=1e9;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
int tmp=fabs((s[j]^s[i-1])-b[k]);
if(tmp<anss)
{
anss=tmp;
anslen=j-i+1;
}
else if(tmp==anss)
{
anslen=max(anslen,j-i+1);
}
}
}
X[k]=anslen;
}
}
int main()
{
// freopen("C:/Users/hzy/Desktop/11.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
s[0]=0;
for(int i=1;i<=n;i++){scanf("%d",&a[i]);s[i]=s[i-1]^a[i];}//预处理
scanf("%d",&m);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
int num=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
c[num].s=s[j]^s[i-1],c[num++].len=j-i+1;//预处理
sort(c,c+num,cmp);
for(int i=0;i<num;i++) d[i]=c[i].s;
for(int i=1;i<=m;i++)
{ //lower_bound(),upper_bound()不适合 -_-!
int l=low(0,num-1,b[i]),r=high(0,num-1,b[i]);
if(l==-1) //l:代表第一个小于等于b[i]的(相等值下取右侧)
{
O[i]=c[r].len;printf("%d\n",c[r].len);
}
else if(r==-1)//r:代表第一个大于等于b[i]的(相等值下取右侧)
{
O[i]=c[l].len;printf("%d\n",c[l].len);
}
else
{
O[i]=max(c[l].len,c[r].len);
if(fabs(d[l]-b[i])>fabs(d[r]-b[i]))
{
O[i]=c[r].len;
printf("%d\n",c[r].len);
}
else if(fabs(d[l]-b[i])==fabs(d[r]-b[i]))
{
O[i]=max(c[l].len,c[r].len);
printf("%d\n",max(c[l].len,c[r].len));
}
else
{
O[i]=c[l].len;
printf("%d\n",c[l].len);
}
}
}
// solve(); //对拍测试用
// for(int i=1;i<=m;i++)
// {
// if(O[i]!=X[i]) {printf("t=%d\n",t);break;}
// }
printf("\n");
}
return 0;
}