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 < ...
随机推荐
- 解决关于IIS10.0下无法安装 URL 重写模块 2的问题
win10 系统自带的IIS是IIS10.0,官网提示URL Rewrite 2.0是只要IIS7.0以上的版本就可以安装,但是在IIS10.0下安装却一直失败.错误提示如下: 那么如何才能正确安装呢 ...
- 谈谈GUI的配色和字体选择
对于工控领域的显示屏,显示效果很难和电脑屏幕相比.电脑上操作系统或者各种软件的配色方案,在应用到工业控制屏上就会出现“完全不是所想要”的结果,所以工控领域GUI的色彩.字体的选择还是有特别的讲究. 配 ...
- 自定义MVC路由配置
首先我用MVC4新增一个订单查看的功能 1.创建控制器OrderController namespace MvcApplication3.Controllers { public class Orde ...
- JUnit测试工具在项目中的用法
0:33 2013/6/26 三大框架整合时为什么要对项目进行junit测试: |__目的是测试配置文件对不对,能跑通就可以进行开发了 具体测试步骤: |__1.对hibernate进行测试 配置hi ...
- JAVA自学之-----FileInputStream类
1, FileInputStream类函数创建: package coreJava; import java.io.FileInputStream; import java.io.IOExceptio ...
- 【转】spring3 MVC实战,手工搭建Spring3项目demo
更新:这几天对spring3的理解又进了一步,今天抽空把这篇文章中的错误和不当之处做了修改. 最近的项目在用Spring3,涉及到了基于注解的MVC,事务管理,与hibernate的整合开发等内容,我 ...
- jQuery中的一些正则匹配表达式
jQuery常用正则匹配表达式 落雨 //整数 "^-?[1-9]\\d*$", //正整数 "^[1-9]\\d*$", //负整数 intege2: &qu ...
- Memcached总结一:memcached简介及适用和不适应场景
Memcached是免费的,开源的,高性能的,分布式内存对象的缓存系统(键/值字典),旨在通过减轻数据库负载加快动态Web应用程序的使用. Memcached是由布拉德·菲茨帕特里克(Brad Fit ...
- 告别山寨数据线:USB Type-C加密认证出炉
从去年苹果发布的MacBook首次采用USB Type-C接口开始,这一标准逐渐成为主流,许多旗舰手机慢慢地采用了这种接口.今日,非盈利机构USB开发者论坛(USB-IF)宣布了USB Type-C认 ...
- UAC新解(有非正常手段可以绕过)
360第一次注册是需要弹,可是以后就不弹了开机自启动不弹框,开机自启动不弹框 服务是system权限再说一句,一般程序也不需要过UAC系统启动项白名单.UAC有一个白名单机制.还有UAC也可以通过wu ...