(哈希)计算之道初赛第五场 - UCloud 的安全秘钥
Posted tak_fate
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(哈希)计算之道初赛第五场 - 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 }
以上是关于(哈希)计算之道初赛第五场 - UCloud 的安全秘钥的主要内容,如果未能解决你的问题,请参考以下文章
2017 计蒜之道 初赛 第五场 A. UCloud 机房的网络搭建
2017 计蒜之道 初赛 第五场 B. UCloud 的安全秘钥(简单)
2017 计蒜之道 初赛 第五场 C. UCloud 的安全秘钥(中等)