这个题不同的处理方式时间差距非常大
第一次我超时了
后来二分做的
跑了700多ms
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
int a[105],b[105];
vector<int> c[105];
for(int i=0;i<105;i++){
c[i].clear();
}
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
for(int j=0;j<n-i+1;j++)
{
int temp=a[j];
for(int k=j+1;k<=j+i-1;k++){
temp^=a[k];
}
c[i].push_back(temp);
}
}
for(int i=1;i<=n;i++){
sort(c[i].begin(),c[i].end());
// for(int j=0;j<c[i].size();j++)
// printf("%d ",c[i][j]);
// printf("\n");
}
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
for(int i=0;i<m;i++){
int len=n;
int temp=1024;
for(int j=n;j>=1;j--){
if(c[j].size()==1){
if(abs(c[j][0]-b[i])<temp){
temp=abs(c[j][0]-b[i]); len=j;
}
}
else {
int dis=lower_bound(c[j].begin(),c[j].end(),b[i])-c[j].begin();
if(dis==0){
if(abs(c[j][0]-b[i])<temp){
temp=abs(c[j][0]-b[i]); len=j;
}
}
else if(dis==c[j].size()){
if(abs(c[j][c[j].size()-1]-b[i])<temp){
temp=abs(c[j][c[j].size()-1]-b[i]); len=j;
}
}
else{
int t=min(abs(c[j][dis]-b[i]),abs(c[j][dis-1]-b[i]));
if(t<temp){
temp=t; len=j;
}
}
}
}
printf("%d\n",len);
}
printf("\n");
}
}
看别人做的
我的多了一次for循环,多跑了100ms
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
const int maxn=1024;
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
int a[105],b[105];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int visit[3000];
memset(visit,0,sizeof(visit));
for(int i=1;i<=n;i++){
for(int j=0;j<n-i+1;j++){
int temp=a[j];
for(int k=j+1;k<j+i;k++)
temp^=a[k];
visit[temp]=i;
}
}
// for(int i=0;i<=10;i++)
// printf("%d ",visit[i]);
// printf("\n");
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
for(int i=0;i<m;i++){
int ans=-1;
for(int j=0;j<2*maxn;j++)
{
if(b[i]+j<2*maxn&&visit[b[i]+j]>0){
ans=max(ans,visit[b[i]+j]);
}
if(b[i]-j>=0&&visit[b[i]-j]>0){
ans=max(ans,visit[b[i]-j]);
}
if(ans!=-1) break;
}
printf("%d\n",ans);
}
printf("\n");
}
}
别人的,60多ms
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
const int maxn=1024;
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
int a[105],b[105];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int visit[3000];
memset(visit,-1,sizeof(visit));
for(int i=0;i<n;i++){
int now=0;
for(int j=i;j<n;j++){
now^=a[j];
visit[now]=max(visit[now],j-i+1);
}
}
// for(int i=0;i<=10;i++)
// printf("%d ",visit[i]);
// printf("\n");
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
for(int i=0;i<m;i++){
int ans=-1;
for(int j=0;j<2*maxn;j++)
{
if(b[i]+j<2*maxn&&visit[b[i]+j]>0){
ans=max(ans,visit[b[i]+j]);
}
if(b[i]-j>=0&&visit[b[i]-j]>0){
ans=max(ans,visit[b[i]-j]);
}
if(ans!=-1) break;
}
printf("%d\n",ans);
}
printf("\n");
}
}