POJ3349 Snowflake Snow Snowflakes(哈希表)
题目链接http://poj.org/problem?id=3349
题意是说,有n片雪花,每片雪花都是有6个角,给出每片雪花每个角的长度,问里面有没有一样的雪花(给出数据的顺序是没有确定的)。
虽然使用了哈希查找表,却还是用了2400多Ms,但还是过了。
这里采用hash数组作为表头,他的下标作为哈希值用于快速定位,next存放的是当hash下标相同时的另一个下标,把他们连接起来,可用于解决矛盾。
如10个数a[]=(下标从1开始,之后会知道为什么)
123456789 ,321654853 ,136977123 ,111234682 ,123458536
222222222 ,454646546 ,787878789 ,919191911, 121321231
哈希函数是
x=a%100;
那么他们哈希值依次是
89 53 23 82 36
22 46 89 11 31
所以除了第7(下标)个外,其他的hash[哈希值]=对应的原数组的下标,如:
hash[89]=1,hash[11]=9,hash[31]=10;
next[0]=1,next[9]=0,next[10]=0
当 插入787878789时,
u=hash[89]=1;(这里就可以看出上面说的为什么下标从1开始,如果下标从0开始的话,u=0,会被误认为没有冲突)
那么next[8]=hash[89]=1;(放的都是下标),hash[89]=8; 这样就能从下表为8找到下标为1的值具体语句是:
while(u){
if(下标为u的已经存在)return flase;
u=next[u];
}
本体代码如下:另外判重的方法在大妈中给出,读者可以好好体会一下(也就是一个小技巧)
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<queue> 5 #include<string> 6 #include<stack> 7 #include<cmath> 8 #include<cctype> 9 #include<iostream> 10 #include<set> 11 #include<algorithm> 12 #include<ctime> 13 #include<vector> 14 using namespace std; 15 #define mem(a) memset(a,0,sizeof(a)) 16 #define MAXN 1000007 17 int hash[MAXN],next[MAXN]; 18 int snow[100007][6]; 19 bool isfind; 20 bool judge(int a,int b)//比较下标为a,b的两片雪花是否相同 21 { 22 int i,j,k; 23 for(i=0;i<6;i++) 24 { 25 for(j=i,k=0;k<6;k++,j=(j+1)%6)//顺时针,有一点点小技巧 26 if(snow[a][k]!=snow[b][j])break; 27 if(k==6)return true; 28 for(j=i,k=0;k<6;k++,j=(j+5)%6)//逆时针 29 if(snow[a][k]!=snow[b][j])break; 30 if(k==6)return true; 31 } 32 return false; 33 } 34 35 bool try_to_insert(int a[],int index) 36 { 37 int i,u; 38 int x=0; 39 for(i=0;i<6;i++)//哈希 采用平方取模的方法 40 x=(int)((((long long)a[i]*(long long)a[i])+x)%MAXN); 41 u=hash[x];//hash里面放的是index,即数组的下标,x作为下标,可用于快速查找 42 while(u) 43 { 44 if(judge(index,u))return false; 45 u=next[u]; 46 } 47 next[index]=hash[x];//把下标用next链接起来 48 hash[x]=index;//新的下标作为表头 49 return true; 50 } 51 int main() 52 { 53 int n,j,i; 54 while(~scanf("%d",&n)) 55 { 56 for(i=1;i<=n;i++) 57 for(j=0;j<6;j++) 58 scanf("%d",&snow[i][j]); 59 isfind=false; 60 mem(next);mem(hash);i=1; 61 while(try_to_insert(snow[i],i)&&i<=n) 62 { 63 i++; 64 } 65 if(i==n+1)printf("No two snowflakes are alike.\n"); 66 else printf("Twin snowflakes found.\n"); 67 } 68 return 0; 69 }
转载于:https://www.cnblogs.com/gj-Acit/archive/2013/04/16/3025144.html
POJ3349 Snowflake Snow Snowflakes(哈希表)相关推荐
- POJ3349 Snowflake Snow Snowflakes(hash)
题意: 雪花有六条棱,每条棱对应一个数,要求在一组雪花中看能否寻找到所有棱对应相同的雪花(棱有顺序要求). 要点: 刚自学了一下hash,这题刚上手有点思路但自己实在也写不出来,看了网上的代码觉得还是 ...
- poj3349——Snowflake Snow Snowflakes
题目大意:给出几个雪花的六个手臂长度,可能以顺时针或逆时针的顺序给出,但是不一定从何处开始,求是否有相同的雪花 输入:雪花个数n( 0 < n ≤ 100000) 第i个雪花的六个手臂长度(手臂 ...
- POJ3349 Snowflake Snow Snowflakes
这是一道Hash题 说到hash,我们就想到了字符串 然后就想到了string 然后我就想到了之前我写的一篇博客:这好像称不上是博客 然后我们就想到了用basic_string做这道题 队形好评 虽然 ...
- Snowflake Snow Snowflakes(哈希表的应用)
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 27312 Accep ...
- 【POJ No. 3349】 雪花 Snowflake Snow Snowflakes
[POJ No. 3349] 雪花 Snowflake Snow Snowflakes POJ 题目地址 [题意] 你可能听说过没有两片雪花是一样的,请编写一个程序来确定这是否是真的. 已知每片雪花6 ...
- Snowflake Snow Snowflakes
文章目录 Snowflake Snow Snowflakes Snowflake Snow Snowflakes 题意: 给定一个n个六边形雪花,判定是否存在相同的 分析: 链表hash hash 值 ...
- Snowflake Snow Snowflakes(hash)
F - Snowflake Snow Snowflakes Time Limit:4000MS Memory Limit:65536KB 64bit IO Format:%I64d & ...
- 【POJ3349】Snowflake Snow Snowflakes(哈希表判重,维护一个集合)
problem 有n片雪花,每片有6个脚,每个脚有一个长度. 两片雪花是一样的当且仅当每个脚的长度顺序都一样(顺逆时针和开始位置不管) 求n片雪花中是否有一样的雪花. solution 维护一个哈希表 ...
- ***POJ 3349 Snowflake Snow Snowflakes(哈希)
第一次学习哈希,基本模仿题解写的 思路:首先这题时间比较紧,所以只能用加法求余来构造哈希表,然后容易出现冲突,所以冲突之后还需要判断是否为同种. 并且雪花有顺逆时针,所以需要两种时针方向,每种时针方向 ...
最新文章
- 关于sql中case when的用法
- redis 用setbit(bitmap)统计活跃用户
- 【作死】更新macOS Mojave后Vagrant无法使用
- Linux下二进制包、源代码包、rpm.binary与rpm.source
- 实战解读ASP.NET Core身份认证
- mybatis plus 插入生成id_早点下班陪女朋友系列之Mybatis-plus代码生成器
- 用二次探测法建立hash表
- Qt 使用资源管理器打开文件夹,并定位到指定文件。
- html5 3d动画效果代码,精选9款迷人的HTML5 3D动画效果及源码
- java 生成 rtf_如何从Java生成RTF?
- 学习累了吗,来听听乔布斯的演讲吧!
- 曾经我们无话不说,如今却渐渐形同陌路
- Oracle 软件包及补丁包免费下载及简单说明
- MYSQL相比于其他数据库有哪些特点?
- dmd oracle,【智能科技学院】TF-SWUFE Oracle Club DMD方向召开第五周核心成员分享会...
- 服务计算作业二——GO语言TDD实践报告
- The Picture of Dorian Gray——17
- 软件测试英语单词词汇
- python安装方法32位_python安装教程
- 计算机使用痕迹,彻底清除电脑使用痕迹的方法
热门文章
- 大型企业***技术(cisco)
- 编译错误: Too much data space used by DLL's in MODULES section
- sqlite 常用命令
- L2-038 病毒溯源 (25 分)-PAT 团体程序设计天梯赛 GPLT
- linux下插入的mysql数据乱码问题及第三方工具显示乱码问题
- 述 SQL 中的 distinct 和 row_number() over() 的区别及用法
- 《万物互联》——1.3 什么样的物体可以接入物联网
- 《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.6节理解与记忆
- Python 函数式编程,从入门到放弃
- .NET Core通讯模块在Linux下的性能测试