您的位置:首页 > 其它

中国大学生程序设计竞赛 (合肥) 异或密码

2017-08-07 12:03 267 查看
题目传送门

直接上代码 题解在代码里

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = 1 << 12;
int dp[MAX];
int a[105];
int main()
{
int t;
scanf("%d",&t);
while(t--) {
memset(dp,0,sizeof(dp));
int n;
scanf("%d",&n);
for(int i = 0; i <n ; i++) {
scanf("%d",&a[i]);
dp[a[i]] = 1; //初始化达到 a[i] 长度为1
}
for(int l = 2; l <= n; l++) { //dp数组储存达到 ans1的情况下最长的长度
for(int i = 0; i < n-l+1; i++) {
int j = i+l-1;
int ans1 = a[i];
for(int k = i+1; k <= j; k++) {
ans1 = a[k]^ans1;
}
dp[ans1] = max(l,dp[ans1]);
}
}
int m;
scanf("%d",&m);
while(m--) {
int x;
scanf("%d",&x);
int ans = -1;
int i;
for(i = 0;; i++) { //i表示x 与左右两边的距离
if(i+x < MAX && dp[i+x]!=0) { //向右搜索最短距离
ans = max(dp[x+i],ans);
}
if(x-i > -1 && dp[x-i]!=0) { //同时向左搜索最短距离
ans = max(dp[x-i],ans);
}
if(ans != -1) //找到最短距离退出
break;
}
printf("%d\n",ans);
}
cout << endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp
相关文章推荐