题目链接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(哈希表)相关推荐

  1. POJ3349 Snowflake Snow Snowflakes(hash)

    题意: 雪花有六条棱,每条棱对应一个数,要求在一组雪花中看能否寻找到所有棱对应相同的雪花(棱有顺序要求). 要点: 刚自学了一下hash,这题刚上手有点思路但自己实在也写不出来,看了网上的代码觉得还是 ...

  2. poj3349——Snowflake Snow Snowflakes

    题目大意:给出几个雪花的六个手臂长度,可能以顺时针或逆时针的顺序给出,但是不一定从何处开始,求是否有相同的雪花 输入:雪花个数n( 0 < n ≤ 100000) 第i个雪花的六个手臂长度(手臂 ...

  3. POJ3349 Snowflake Snow Snowflakes

    这是一道Hash题 说到hash,我们就想到了字符串 然后就想到了string 然后我就想到了之前我写的一篇博客:这好像称不上是博客 然后我们就想到了用basic_string做这道题 队形好评 虽然 ...

  4. Snowflake Snow Snowflakes(哈希表的应用)

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

  5. 【POJ No. 3349】 雪花 Snowflake Snow Snowflakes

    [POJ No. 3349] 雪花 Snowflake Snow Snowflakes POJ 题目地址 [题意] 你可能听说过没有两片雪花是一样的,请编写一个程序来确定这是否是真的. 已知每片雪花6 ...

  6. Snowflake Snow Snowflakes

    文章目录 Snowflake Snow Snowflakes Snowflake Snow Snowflakes 题意: 给定一个n个六边形雪花,判定是否存在相同的 分析: 链表hash hash 值 ...

  7. Snowflake Snow Snowflakes(hash)

    F - Snowflake Snow Snowflakes Time Limit:4000MS     Memory Limit:65536KB     64bit IO Format:%I64d & ...

  8. 【POJ3349】Snowflake Snow Snowflakes(哈希表判重,维护一个集合)

    problem 有n片雪花,每片有6个脚,每个脚有一个长度. 两片雪花是一样的当且仅当每个脚的长度顺序都一样(顺逆时针和开始位置不管) 求n片雪花中是否有一样的雪花. solution 维护一个哈希表 ...

  9. ***POJ 3349 Snowflake Snow Snowflakes(哈希)

    第一次学习哈希,基本模仿题解写的 思路:首先这题时间比较紧,所以只能用加法求余来构造哈希表,然后容易出现冲突,所以冲突之后还需要判断是否为同种. 并且雪花有顺逆时针,所以需要两种时针方向,每种时针方向 ...

最新文章

  1. 关于sql中case when的用法
  2. redis 用setbit(bitmap)统计活跃用户
  3. 【作死】更新macOS Mojave后Vagrant无法使用
  4. Linux下二进制包、源代码包、rpm.binary与rpm.source
  5. 实战解读ASP.NET Core身份认证
  6. mybatis plus 插入生成id_早点下班陪女朋友系列之Mybatis-plus代码生成器
  7. 用二次探测法建立hash表
  8. Qt 使用资源管理器打开文件夹,并定位到指定文件。
  9. html5 3d动画效果代码,精选9款迷人的HTML5 3D动画效果及源码
  10. java 生成 rtf_如何从Java生成RTF?
  11. 学习累了吗,来听听乔布斯的演讲吧!
  12. 曾经我们无话不说,如今却渐渐形同陌路
  13. Oracle 软件包及补丁包免费下载及简单说明
  14. MYSQL相比于其他数据库有哪些特点?
  15. dmd oracle,【智能科技学院】TF-SWUFE Oracle Club DMD方向召开第五周核心成员分享会...
  16. 服务计算作业二——GO语言TDD实践报告
  17. The Picture of Dorian Gray——17
  18. 软件测试英语单词词汇
  19. python安装方法32位_python安装教程
  20. 计算机使用痕迹,彻底清除电脑使用痕迹的方法

热门文章

  1. 大型企业***技术(cisco)
  2. 编译错误: Too much data space used by DLL's in MODULES section
  3. sqlite 常用命令
  4. L2-038 病毒溯源 (25 分)-PAT 团体程序设计天梯赛 GPLT
  5. linux下插入的mysql数据乱码问题及第三方工具显示乱码问题
  6. 述 SQL 中的 distinct 和 row_number() over() 的区别及用法
  7. 《万物互联》——1.3 什么样的物体可以接入物联网
  8. 《CCIE路由和交换认证考试指南(第5版) (第2卷)》——1.6节理解与记忆
  9. Python 函数式编程,从入门到放弃
  10. .NET Core通讯模块在Linux下的性能测试