Snowflake Snow Snowflakes(Hash + 链式前向星)
一、题意
每片雪花是由6个角组成,每片雪花的6个角由顺时针的顺序给出,当两片雪花顺时针或逆时针的角度相同时,则为雪花是同一片雪花。问n片雪花中是否有相同的雪花。
二、题解
- 我们定义HashHashHash函数Hash=Hash =Hash=(∑i=16ai+∏i=16ai)modp(\sum_{i = 1}^{6}ai+\prod_{i = 1}^{6}ai)mod p(∑i=16ai+∏i=16ai)modp。
- 当两片雪花的Hash相同时,我们则进一步来根据顺序来判断这两片雪花的角度是否完全一致。
- 我们可以建立将Hash作为表头来创建链式前向星,从而降低复杂度。
三、Acode
/** @Author: NEFU_马家沟老三* @LastEditTime: 2020-09-06 17:11:39* @CSDN blog: https://blog.csdn.net/acm_durante* @E-mail: 1055323152@qq.com* @ProbTitle: */
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define lowbit(x) ((x) & -(x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define mem(a, b) memset(a, b, sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const double PI = acos(-1.0);
const int MAXN = 100050;
const int mod = 99991;
struct node
{int a[7],next;
}e[MAXN];
int head[MAXN],num[7],cnt = 0;int Hash(){//得到Hash函数int sum = 0,mul = 1;rep(i,0,5){sum = (sum + num[i]) % mod;mul = (ll) mul * num[i] % mod;}return (sum + mul) % mod;
}void add(int val){//添加边++cnt;rep(i,0,5){e[cnt].a[i] = num[i];} e[cnt].next = head[val];head[val] = cnt;
}bool equal(int pos){//精确判断角度是否相同bool flag = 0;rep(i,0,5){rep(j,0,5){flag = 0;rep(k,0,5){if(e[pos].a[ (i+k) % 6] != num[( j + k) % 6]) flag = 1;}if( flag == 0 ) return 1;flag = 0;rep(k,0,5){if(e[pos].a[(i+k)%6] != num[(6 + j - k) % 6] ) flag = 1;}if(!flag) return 1;}}return 0;
}bool solve(){int val = Hash();for(int i = head[val] ; ~i ; i = e[i].next){//遍历链式前向星if(equal(i)) return 1;}add(val);return 0;
}
int main()
{int n;mem(head,-1);scanf("%d",&n);rep(i,1,n){rep(j,0,5)scanf("%d",&num[j]);if(solve()){puts("Twin snowflakes found.");return 0;}}puts("No two snowflakes are alike.");return 0;
}
Snowflake Snow Snowflakes(Hash + 链式前向星)相关推荐
- Balkan2007]Toponyms[链式前向星建字典树+getchar()读入优化]
思路容易想,卡空间和时间就吐了 用链式前向星压缩空间,用getchar()一位一位读加快读入 #include <iostream> #include <cstdio> #in ...
- P3366 【模板】最小生成树(链式前向星,prim,有坑)难度⭐⭐
题目链接 输入: 4 5 1 2 2 1 3 2 1 4 3 2 3 4 3 4 3 输出: 7 链式前向星相比于矩阵,遍历的代码更加复杂一点,但是省空间,这道题用矩阵存就MLE,只能用链式前向星存. ...
- P1155 双栈排序(二分图的染色判断+链式前向星)
P1155 双栈排序 让字典序最小,当然尽量进S1 那什么时候必须进S2呢? a[i]和a[j] 不能压入同一个栈⇔存在一个k,使得i<j<k且a[k]<a[i]<a[j] 因 ...
- 邻接表存储(链式前向星)
细节 链式前向星: head[i] 存储顶点i当前出边的编号 to[num] 存储当前出边的终点 w[num] 存储当前出边的权值 next[num] 存储上一条从顶点i出发的边的边号 N个顶点对应N ...
- 可持久化链表(链式前向星)
http://codeforces.com/group/aUVPeyEnI2/contest/229670 1 /******************************************* ...
- 链式前向星模板 建图+dfs+bfs+dijkstra
边没有用struct封装起来,节点和边的计数起点如果不符合习惯可以稍作修改 建图+DFS+BFS #include <cstdio> #include <cstring> #i ...
- 图的存储 邻接矩阵+邻接表+链式前向星
图的存储 - 邻接矩阵 在树的问题中,邻接矩阵是空间.时间的极大浪费. 假设树的结点个数为 N = 100000. 建立邻接矩阵需要空间为 1e5*1e5 但是由于只有 N - 1 条边,所以在邻接矩 ...
- 图的储存方式,链式前向星最简单实现方式 (边集数组)
对于图来说,储存方式无非就是邻接矩阵.邻接表,今天看了看链式前向星的储存方式,说来说去不还是链表,是一种链表的简单的实现方式,还是比较好理解的.看他们写个结构体,个人不喜欢,没必要,也嫌麻烦,换一种更 ...
- 存图利器——链式前向星
存图的各种数据结构,复杂如下 邻接矩阵 O(1)(查询一条边) O(n)枚举出边 O(N*N)空间复杂度 前向星 O(n)(查询一条边) O(n)枚举出边 O(N ...
最新文章
- Jmeter(二十九)_dotnet搭建本地接口服务
- 还记得那个提速8倍的IDEA插件吗?VS Code版本也发布啦!
- [你必须知道的.NET]第二十七回:interface到底继承于object吗?
- ZedGraph5.1.5源码分析去掉鼠标悬浮内容闪烁问题(附源码下载)
- 4键电子手表说明书_数字S1系统7寸门口主机操作说明书
- 【君义精讲】多种方法求斐波那契数列
- SetTimer OnTimer WM_TIMER
- oracle 9.2.0.1下载,Oracle 9i 从9.2.0.1升级到 9.2.0.6 步骤
- 三七互娱U3D面经2021.3.31
- 从CSDN用户密码泄露谈一些非技术安全对策
- 笔记--《谷歌和亚马逊是怎么做产品的》第一至三章
- 如何检测java安装成功_如何检查jdk是否安装成功
- ToStringBuilder用法
- IEC61850学习手册
- 服务器显示屏 超出工作频率范围,如何解决显示器出错提示:超出工作频率范围...
- 我的Android进阶之旅------android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
- 【Python爬虫历程】使用Cookie来模拟登陆
- etc门架系统服务器是什么,ETC门架是什么东西?ETC龙门架作用
- mysql异常Incorrect string value: ‘\xE6\xB5\x8B\xE8\xAF\x95‘ for column ‘region_name‘
- 电子技术部第四次培训总结