考察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 表)的更多相关文章

  1. [poj3349]Snowflake Snow Snowflakes(hash)

    Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 37615 Accepted: ...

  2. POJ--3349 Snowflake Snow Snowflakes(数字hash)

    链接:Snowflake Snow Snowflakes 判断所有的雪花里面有没有相同的 每次把雪花每个角的值进行相加和相乘 之后hash #include<iostream> #incl ...

  3. poj3349 Snowflake Snow Snowflakes【HASH】

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 49991   Accep ...

  4. POJ3349 Snowflake Snow Snowflakes (hash

    Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 48624   Accep ...

  5. POJ3349 Snowflake Snow Snowflakes 【哈希表】

    题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...

  6. 【POJ3349 Snowflake Snow Snowflakes】【Hash表】

    最近在对照省选知识点自己的技能树 今天是Hash 题面 大概是给定有n个6元序列 定义两个序列相等 当两个序列各自从某一个元素开始顺时针或者逆时针旋转排列能得到两个相同的序列 求这n个6元序列中是否有 ...

  7. poj3349 Snowflake Snow Snowflakes —— 哈希表

    题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...

  8. poj3349 Snowflake Snow Snowflakes

    吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...

  9. POJ 3349 Snowflake Snow Snowflakes Hash

    题目链接: http://poj.org/problem?id=3349 #include <stdio.h> #include <string.h> #include < ...

随机推荐

  1. Timer组件

    1.常用属性 Interval 用于获取或设置Timer组件Tick事件发生的时间间隔,属性值不能小于1 制作左右飘摇窗体 private void timer1_Tick(object sender ...

  2. javascript 通用loading动画效果

    由于项目中多处要给ajax提交的时候增加等待动画效果,所以就写了一个简单的通用js方法: 代码如下: /*ajax提交的延时等待效果*/ var AjaxLoding = new Object(); ...

  3. ARM的工作环境和工作模式

    工作环境: 可以称之为“数据环境,”数据总线16位或者32位,应用于不同的情况下.16位的情况下,工作速度快,代码密度高. 工作模式: 设置程序数据所处的状态,为移植操作系统提供方便.

  4. ios字符串操作

    string的操作应用 NSRange range = [self.general rangeOfString:@"."]; NSString *str = [self.gener ...

  5. 常用的四种CSS样式表格

    1. 单像素边框CSS表格 这是一个很常用的表格样式. [html] <style type="text/css"> table.gridtable { font-fa ...

  6. CQRS学习——IOC,配置,仓储隔离以及QueryEntry[其三]

    从IoC开始说起 博主最早开始用的IoC容器叫AutoFac,那时候用它主要是为了生命周期管理——将EF上下文的生命周期限定为每请求.当然也总是每每听到IoC的好处,但是仍然不能理解其优势.最近在学习 ...

  7. 解决Ubuntu14.04下Clementine音乐播放器不能播放wma文件的问题

    参考:Ubuntu 14.04 安装深度音乐的方法 问题描述:播放wma文件时提示"GStreamer插件未安装". 解决方法:安装gstreamer-ffmpeg插件即可解决问题 ...

  8. nginx -t "nginx: [warn] only the last index in "index" directive should be absolute in 6 "的问题解决

    修改完nginx的配置文件之后,执行nginx -t命令提示"nginx: [warn] only the last index in "index" directive ...

  9. *[codility]Number-of-disc-intersections

    http://codility.com/demo/take-sample-test/beta2010/ 这题以前做的时候是先排序再二分,现在觉得没有必要.首先圆可以看成线段,把线段的进入作为一个事件, ...

  10. 解决MYSQL 8小时连接问题

    之前在使用SSH开发项目的时候遇到了一个很奇怪的问题,部署到服务器上,运行一段时间后系统就崩溃了. 出现错误:org.hibernate.exception.JDBCConnectionExcepti ...