当前位置:首页 > Windows程序 > 正文

雪花雪花雪花 = 哈希

2024-03-31 Windows程序

https://www.acwing.com/problem/content/139/

技术图片

#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; int a[20]; ull ha[20]; ull mod = 1e6 + 7; unordered_map<ull, vector<vector<int> > > m; bool check(ull key, vector<int> &vec) { auto vi = m.find(key); if(vi == m.end()) return false; for(auto v : (vi->second)) { bool suc = 1; for(int i = 0; i < 7; ++i) { if(v[i] != vec[i]) { suc = 0; break; } } if(suc) return true; } return false; } int main() { #ifdef Yinku freopen("Yinku.in", "r", stdin); #endif // Yinku srand(time(0)); for(int i = 0; i < 12; ++i) { ha[i] = rand(); ha[i] = (ha[i] << 16) | rand(); ha[i] = (ha[i] << 16) | rand(); ha[i] = (ha[i] << 16) | rand(); } int n; scanf("%d", &n); vector<ull> vec; vector<int> vv(7); while(n--) { for(int i = 0; i < 6; ++i) { scanf("%d", &a[i]); a[i + 6] = a[i]; } vec.clear(); for(int j = 0; j < 6; ++j) { ull cur = 0; for(int i = 0; i < 6; ++i) { cur += (ha[i] + ((a[i + j] << 32) | a[i + j])); } vec.push_back(cur); } reverse(a, a + 12); for(int j = 0; j < 6; ++j) { ull cur = 0; for(int i = 0; i < 6; ++i) { cur += (ha[i] + ((a[i + j] << 32) | a[i + j])); } vec.push_back(cur); } sort(vec.begin(), vec.end()); ull key = 0; for(int j = 0; j < 12; ++j) { key = (key << 4) ^ (ha[j]) ^ (vec[j]); } sort(a, a + 6); vv[0] = 0; for(int i = 0; i < 6; ++i) { vv[i + 1] = a[i]; vv[0] += a[i]; } if(check(key, vv)) { puts("Twin snowflakes found."); return 0; } m[key].push_back(vv); } puts("No two snowflakes are alike."); }

AcWing - 137 - 雪花雪花雪花 = 哈希

标签:

原文地址:https://www.cnblogs.com/Inko/p/11729785.html

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/8763.html

Jm-杰米博客Jamie
草根站长的技术交流乐园!IT不会不要紧快来好好学习吧!
  • 20786文章总数
  • 7494584访问次数
  • 建站天数
  • 友情链接