(哈希)计算之道初赛第五场 - UCloud 的安全秘钥

这种渣比代码也能A?

数据太水了吧。。

按长度统一起来算一次滑动窗口的哈希值,sort一下,二分算数量。

复杂度应该是sqrt(T)*n*logn吧。

自己出个数据都能卡掉。

 

 1 #include <string>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 #include <map>
 7 #include <unordered_map>
 8 
 9 using namespace  std;
10 
11 typedef unsigned long long ull;
12 #define fi first
13 #define se second
14 const int maxn = 50010;
15 
16 unordered_map<int, vector<pair<int, ull> > > query;
17 int n;
18 int num[maxn];
19 
20 int q;
21 ull magic = 1e9 + 7;
22 int ans[maxn << 1];
23 ull fastinit[maxn];
24 
25 unordered_map<int, int > gee;
26 vector<ull> cnt;
27 
28 
29 void init() {
30     fastinit[0] = 1;
31     for(int i = 1; i <= 50000; i++) {
32         fastinit[i] = fastinit[i - 1] * magic;
33     }
34 }
35 
36 ull fast(int k) {
37     return fastinit[k];
38 }
39 
40 ull make_hash() {
41     ull res = 0;
42     for(auto it = gee.begin(); it != gee.end(); it++) {
43         res += it->se * fast(n - (it->fi));
44     }
45     return res;
46 }
47 
48 
49 void count_number(int len) {
50     gee.clear();
51     cnt.clear();
52     for(int i = 0; i < len; i++) {
53         gee[num[i]]++;
54     }
55     ull res = make_hash();
56     cnt.push_back(res);
57     for(int i = 1; i <= n - len; i++) {
58         res -= fast(n - num[i - 1]);
59         res += fast(n - num[i + len - 1]);
60         cnt.push_back(res);
61     }
62     sort(cnt.begin(), cnt.end());
63 }
64 
65 
66 int main() {
67     init();
68     scanf("%d", &n);
69     for(int i = 0; i < n; i++) {
70         scanf("%d", &num[i]);
71     }
72     scanf("%d", &q);
73     for(int c = 0; c < q; c ++) {
74         int m;
75         gee.clear();
76         scanf("%d", &m);
77         for(int i = 0; i < m; i++) {
78             int x;
79             scanf("%d", &x);
80             gee[x]++;
81         }
82         query[m].push_back(make_pair(c, make_hash()));
83     }
84     for(auto it = query.begin(); it != query.end(); it++) {
85         int len = it->fi;
86         count_number(len);
87         for(auto vt = it->se.begin(); vt != it->se.end(); vt++) {
88             int ind = vt->fi;
89             ull ha = vt->se;
90             ans[ind] = upper_bound(cnt.begin(), cnt.end(), ha) - lower_bound(cnt.begin(), cnt.end(), ha);
91         }
92     }
93     for(int i = 0; i < q; i++) {
94         printf("%d\n", ans[i]);
95     }
96     return 0;
97 }

 

posted @ 2017-06-04 14:40  tak_fate  阅读(447)  评论(0编辑  收藏  举报