poj3349(哈希表应用)
来源:互联网 发布:货车租赁软件 编辑:程序博客网 时间:2024/06/06 03:42
题目链接:http://poj.org/problem?id=3349
题目大意:给出一系列数列,每一行数列描述的是雪花的每一个雪花臂的长度,要求判断这一系列雪花有没有相同的(只要对应位置雪花臂等长即可,顺时针和逆时针都可以)。
解题思路:由于数据量太大(最多会有100000行数列),若采用两重for循环比较的方式,复杂度为O(n^2),一定会超时,因此采用哈希表进行存储,计算每一个序列的hash值,根据该hash值决定数列存储位置,若hash值不同,可以认为雪花一定不相同,这样一来,可以只比较hash值相同的雪花序列,比较的次数大大减少。
AC代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define mod 14997typedef struct{ int a[6];}Node;Node node[15000][100];int index[15000];int gethash(Node n){ int prime=0; for(int i=0;i<6;i++) { prime += n.a[i]%mod; } prime %= mod; return prime;}bool cmp(Node x,Node y){ int i,j; //向右比较 for(int beginn=0;beginn<6;beginn++) { for(i=beginn,j=0;j<6;j++,i=(i+1)%6) { if(x.a[i]!=y.a[j])break; } if(j>=6)return true; } //向左比较 for(int beginn=0;beginn<6;beginn++) { for(i=beginn,j=0;j<6;j++,i=(i+5)%6) { if(x.a[i]!=y.a[j])break; } if(j>=6)return true; } return false;}int main(){ int n; scanf("%d",&n); memset(index,0,sizeof(index)); while(n--) { Node input; for(int i=0;i<6;i++) { scanf("%d",&input.a[i]); } int hashvalue = gethash(input); for(int i=0;i<index[hashvalue];i++) { bool flag = cmp(input,node[hashvalue][i]); // cout<<flag<<endl; if(flag) { printf("Twin snowflakes found.\n"); return 0; } } node[hashvalue][index[hashvalue]] = input; index[hashvalue]++; } printf("No two snowflakes are alike.\n"); return 0;}
0 0
- poj3349(哈希表应用)
- POJ3349 哈希表
- 【poj3349】Snowflake Snow Snowflakes(哈希表)
- poj3349(hash)
- poj3349
- poj3349
- POJ3349
- POJ3349
- poj3349
- poj3349
- POJ3349
- POJ3349
- poj3349
- poj3349
- POJ3349
- poj3349
- POJ3349
- poj3349
- maven
- 在ubuntu下纯指令方式搭建php开发环境
- thinkPHP bug解决
- 二分图大讲堂——彻底搞定最大匹配数(最小覆盖数)、最大独立数、最小路径覆盖、带权最优匹配
- 实现秒级execl大批量导入数据到mysql中
- poj3349(哈希表应用)
- Android拍照上传至PHP服务器并写入MySql数据库(下)
- 闲谈杂扯:什么是H.264标准?什么是H.264句法元素?
- bzoj2424(费用流)
- quartz spring 实现动态定时任务
- 一个很好的开源select控件 select2
- Android内存优化之OOM
- 一个不错的iOSdemo
- litjson