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

xiaoxiao2021-02-28  93

题目传送门

直接上代码 题解在代码里

#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; } }

转载请注明原文地址: https://www.6miu.com/read-84199.html

最新回复(0)