首页 > 代码库 > HDU 5968:异或密码(暴力)
HDU 5968:异或密码(暴力)
http://acm.hdu.edu.cn/showproblem.php?pid=5968
题意:中文题意。
思路:一开始不会做,后来发现数据范围很小,而且那个数要是连续的,所以可能把所有情况枚举出来很小吧。打了个表发现 100 只有 4950 个,然后直接暴力枚举每一种情况,放在Hash里面标记是否出现过这个数,再弄一个len数组放置每一种情况长度,然后对答案分别向左和向右找最长的长度就好了。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <string> 7 #include <iostream> 8 #include <stack> 9 #include <map> 10 #include <queue> 11 using namespace std; 12 #define N 100010 13 #define INF 0x3f3f3f3f 14 bool Hash[N]; 15 int len[N]; 16 //vector<int> v; 17 int num[105]; 18 int main() 19 { 20 int t; 21 scanf("%d", &t); 22 while(t--) { 23 int n; 24 scanf("%d", &n); 25 for(int i = 1; i <= n; i++) scanf("%d", &num[i]); 26 memset(Hash, 0, sizeof(Hash)); 27 memset(len, 0, sizeof(len)); 28 for(int i = 1; i <= n; i++) { 29 for(int j = 1; j + i - 1 <= n; j++) { 30 int tmp = 0; 31 for(int k = 0; k < i; k++) { 32 tmp ^= num[k + j]; 33 } 34 Hash[tmp] = 1; 35 len[tmp] = max(len[tmp], i); 36 // v.push_back(tmp); 37 } 38 } 39 // puts("----------------"); 40 // for(int i = 0; i < v.size(); i++) printf("%d ", v[i]); 41 // puts(""); 42 // puts("----------------"); 43 int q; 44 scanf("%d", &q); 45 while(q--) { 46 int ask; 47 scanf("%d", &ask); 48 int l = 0, ans = -1; 49 bool f = 0; 50 while(!f) { 51 if(ask - l >= 0 && Hash[ask-l]) { 52 ans = len[ask-l]; 53 f = 1; 54 // printf("1 : %d, %d\n", ask - l, ans); 55 } 56 if(Hash[ask+l]) { 57 ans = max(len[ask+l], ans); 58 // printf("2 : %d, %d\n", ask + l, ans); 59 f = 1; 60 } 61 62 l++; 63 } 64 printf("%d\n", ans); 65 } 66 puts(""); 67 } 68 return 0; 69 }
HDU 5968:异或密码(暴力)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。