HDU 5968:异或密码(暴力)
Posted Shadowdsp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:异或密码(暴力)的主要内容,如果未能解决你的问题,请参考以下文章
HDU 5968 异或密码 模拟 中国大学生程序设计竞赛(合肥)
中国大学生程序设计竞赛(合肥)-重现赛1008 HDU 5968