首页 > 代码库 > 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:异或密码(暴力)