POJ3349: Snowflake Snow Snowflakes(hash 表)
考察hash表:
每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的。
我们采用hash的方法,这样每次查询用时为O(1),总用时为O(n)。
hash的本质是把值映射到地址或者下标,如果不同的key值对应到相同的indice上的话,就需要进行chaining处理,吧indice指向一个链表,链表的每一个节点存储共享同一indice的不同key值。
因此问题的核心变成:吧相等的雪花映射到相同的indice上。这里雪花是一个特殊类型,我们不能直接映射,所以我们把每一片雪花的6个arm值的和取模作为该雪花的key值。
即:key=(arm[0]+arm[1]+arm[2]+arm[3]+arm[4]+arm[5]);
AND indice=key%prime
因为题目开出的雪花个数范围最大是10^6。所以我们取一个离10^6很近的99983作为prime(PS:事实上,在10^6周围的大质数都可以,可以随便挑一个)。
但这里又有一个问题:即使key值相同也不能代表两个雪花相同,所以我们当我们把所有的雪花映射到hash表上时,每一个indice指向的邻接表里存储的雪花仅仅是arm和相同。
-----------------------------------------------------------------------------------------
好了,现在我们开始查找相同雪花了:
顺序地,每一个雪花进行枚举,计算他的indice值,然后查看indice指向的邻接表是否为空,若为空,则说明还没有“相同”的雪花的记录。若不为空,则说明有arm和与当前雪花arm和相同的雪花在hash表中,所以我们进一步在indice指向的邻接表中逐一查找。如果发现有arm顺序“匹配”的雪花,就输出“Twin snowflakes found.”,然后程序结束。如果邻接表中没有我们想要的“相等”的雪花,那么我们就枚举下一个雪花。
如果枚举玩所有雪花都没有找到与之相等的雪花,则输出“No two snowflakes are alike.”,程序结束。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
using namespace std;
const int max_size=100010;
const int prime=99991;
vector<int> hsh[prime];
int arm[max_size][6];
int n;
bool isTheSame(int a,int b){
for(int i=0;i<6;i++){
if((//clockwise
arm[a][0]==arm[b][i]&& arm[a][1]==arm[b][(i+1)%6]&&
arm[a][2]==arm[b][(i+2)%6]&& arm[a][3]==arm[b][(i+3)%6]&&
arm[a][4]==arm[b][(i+4)%6]&& arm[a][5]==arm[b][(i+5)%6])
||
//counter clockwise
( arm[a][0]==arm[b][i]&& arm[a][1]==arm[b][(i+5)%6]&&
arm[a][2]==arm[b][(i+4)%6]&& arm[a][3]==arm[b][(i+3)%6]&&
arm[a][4]==arm[b][(i+2)%6]&& arm[a][5]==arm[b][(i+1)%6]))
return true;
}
return false;
}
int main(){
scanf("%d",&n); long long sum,key;
for(int i=0;i<n;i++){
for(int j=0;j<6;j++){
scanf("%d",&arm[i][j]);
}
}
for(int i=0;i<n;i++){
sum=0;
for(int j=0;j<6;j++){
sum+=arm[i][j]*2;
}
key=sum%prime;
vector<int>::size_type k;
for(k=0;k<hsh[key].size();k++){
if(isTheSame(i,hsh[key][k])){
printf("Twin snowflakes found.\n");
exit(0);
} }
hsh[key].push_back(i);
}
printf("No two snowflakes are alike.\n");
}
POJ3349: Snowflake Snow Snowflakes(hash 表)的更多相关文章
- [poj3349]Snowflake Snow Snowflakes(hash)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 37615 Accepted: ...
- POJ--3349 Snowflake Snow Snowflakes(数字hash)
链接:Snowflake Snow Snowflakes 判断所有的雪花里面有没有相同的 每次把雪花每个角的值进行相加和相乘 之后hash #include<iostream> #incl ...
- poj3349 Snowflake Snow Snowflakes【HASH】
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 49991 Accep ...
- POJ3349 Snowflake Snow Snowflakes (hash
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 48624 Accep ...
- POJ3349 Snowflake Snow Snowflakes 【哈希表】
题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...
- 【POJ3349 Snowflake Snow Snowflakes】【Hash表】
最近在对照省选知识点自己的技能树 今天是Hash 题面 大概是给定有n个6元序列 定义两个序列相等 当两个序列各自从某一个元素开始顺时针或者逆时针旋转排列能得到两个相同的序列 求这n个6元序列中是否有 ...
- poj3349 Snowflake Snow Snowflakes —— 哈希表
题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...
- poj3349 Snowflake Snow Snowflakes
吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...
- POJ 3349 Snowflake Snow Snowflakes Hash
题目链接: http://poj.org/problem?id=3349 #include <stdio.h> #include <string.h> #include < ...
随机推荐
- ServiceController组件控制计算机服务
private void Form1_Load(object sender, EventArgs e) { //下面的示例使用 ServiceController 类检查IIS服务是否已停止.如果该服 ...
- componentsJoinedByString 和 componentsSeparatedByString 的方法的区别
将string字符串转换为array数组 NSArray *array = [Str componentsSeparatedByString:@","]; 将array数组转换为 ...
- 关于Windows环境下安装Android模拟器Genymotion的教程
打开Genymotion的官网www.genymotion.com,点击按钮"get genymotion", 选择"Free"下的"DOWNLOAD ...
- 怎么修改tomcat默认访问首页
一般情况下安装好tomcat之后我们的默认访问首页是index了,但我们如果要修改或增加一个默认首页,我们可参考下面办法来解决. 通过 ip:port 访问到的是 tomcat 的管理页面,其他常规部 ...
- H2O与Java线程同步
Java 5以前的线程同步采用syncronized和wait,notify,notifyAll来实现,比较粗糙.之后有了Lock和Condition.ReentrantLock的简单lock,unl ...
- session跨域共享解决方案
要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...
- JAVA大数类练手
今天突然看到了OJ上的大数类题目,由于学习了一点大数类的知识.果断水了6道题......都是非常基础的.就当的练手的吧. 学到的只是一些大数类的基本操作.以后多做点这样的题,争取熟练运用水大数题... ...
- Android 关于HttpClient上传中文乱码的解决办法
使用过HttpClient的人都知道可以通过addTextBody方法来添加要上传的文本信息,但是,如果要上传中文的话,或还有中文名称的文件会出现乱码的问题,解决办法其实很简单: 第一步:设置Mult ...
- Android Studio 快捷键 for Mac OS X 10.5+
Action Mac OSX Win/Linux 注释代码(//) Cmd + / Ctrl + / 注释代码(/**/) Cmd + Option + / Ctrl + Alt + / 格式化代码 ...
- Android 图片从网页中获取并动态加载到listview中
实现功能: 效果图: 代码:这里