.Snowflake Snow Snowflakes——解题报告
题目链接:
http://poj.org/problem?id=3349
题目大意:
雪花上有666个数形成环状,只有当从某个位置为起点,按顺时针或逆时针,能完全和另一个雪花相同时,判断为有两个相同的雪花。现有nnn片雪花,判断是否存在两片相同的雪花。
数据范围:n≤105n \leq 10^5n≤105
题目分析:
1.首先这个题目是个天坑,10510^5105很容易让人想到用map来实现Hash,方便又快捷,然而,本题对单纯的HashHashHash很不友好,数据有意在卡你,基本过不了。
2.其次10510^5105看似可以O(nlogn)O(nlogn)O(nlogn),然而本题卡常数,mapmapmap必不可能过。
3.然后你就想到用链表来做HashHashHash,对HashHashHash值相同的数据循环判断一次对吧?非常遗憾,看似10510^5105随便过,连lognlognlogn都没了,然而卡了你的常数。而且要注意你数据的离散程度,否则链表的效率可能还不如mapmapmap。
4.最坑的地方来了:一定要注意在做HashHashHash函数的时候,千万不能做乘法运算,对于雪花上的数(x≤106x \leq 10^6x≤106),乘法实在太慢了。
5.然后一个很坑的地方是,这个题不能用最小表示法,因为没有必要,且对于这种卡常数的题很容易挂掉。
6.最后就是要注意一下HashHashHash值相同的时候的判断了,由于每片雪花的数字个数是一样的,所以我们可以把其中一个雪花固定从000号位开始,枚举另一个雪花的起点就可以了。
正解代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>using namespace std;
typedef long long ll;
const ll maxn=1000010;
ll n,tot=0,mod=999983;
ll snow[maxn][10],head[maxn],next[maxn];
ll Hash(ll (&A)[10])
{ll sum=1;for(ll i=0;i<6;i++)sum=(sum+A[i])%mod;return sum%mod;
}
bool thesame(ll (&A)[10],ll (&B)[10])
{for(ll i=0;i<6;i++){bool flag=false;for(ll j=0;j<6;j++){ll pos1=j,pos2=(i+j)%6;if(A[pos1]!=B[pos2]){flag=true;break;}}if(!flag)return true;}for(ll i=0;i<6;i++){bool flag=false;for(ll j=0;j<6;j++){ll pos1=j,pos2=(5-i-j+6)%6;if(A[pos1]!=B[pos2]){flag=true;break;}}if(!flag)return true;}return false;
}
bool insert(ll (&A)[10])
{ll weight=Hash(A);for(ll i=head[weight];i!=0;i=next[i])if(thesame(snow[i],A))return true;++tot;for(ll i=0;i<6;i++)snow[tot][i]=A[i];next[tot]=head[weight];head[weight]=tot;return false;
}
int main()
{scanf("%lld",&n);for(ll i=1;i<=n;i++){ll temp[10];for(ll j=0;j<6;j++)scanf("%lld",&temp[j]);if(insert(temp)){printf("Twin snowflakes found.");return 0;}}printf("No two snowflakes are alike.");return 0;
}
.Snowflake Snow Snowflakes——解题报告相关推荐
- Snowflake Snow Snowflakes
文章目录 Snowflake Snow Snowflakes Snowflake Snow Snowflakes 题意: 给定一个n个六边形雪花,判定是否存在相同的 分析: 链表hash hash 值 ...
- 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(hash)
F - Snowflake Snow Snowflakes Time Limit:4000MS Memory Limit:65536KB 64bit IO Format:%I64d & ...
- POJ 3349 Snowflake Snow Snowflakes
/* 哈希第一题啊..! 谢谢 http://www.cnblogs.com/Dario67/archive/2011/04/09/2010724.html 的博主 这题投机取巧了,判断是否相等 直接 ...
- UVa 3349 Snowflake Snow Snowflakes(Hash)
http://poj.org/problem?id=3349 题意: 给出n片雪花留个角的长度,要求判断是否有一样的雪花. 思路: Hash表的应用. 首先将每个雪花所有角的总长计算出来,如果两片雪花 ...
- POJ3349 Snowflake Snow Snowflakes(哈希表)
题目链接http://poj.org/problem?id=3349 题意是说,有n片雪花,每片雪花都是有6个角,给出每片雪花每个角的长度,问里面有没有一样的雪花(给出数据的顺序是没有确定的). 虽然 ...
- 【POJ3349】Snowflake Snow Snowflakes(哈希表判重,维护一个集合)
problem 有n片雪花,每片有6个脚,每个脚有一个长度. 两片雪花是一样的当且仅当每个脚的长度顺序都一样(顺逆时针和开始位置不管) 求n片雪花中是否有一样的雪花. solution 维护一个哈希表 ...
- POJ3349 Snowflake Snow Snowflakes(hash)
题意: 雪花有六条棱,每条棱对应一个数,要求在一组雪花中看能否寻找到所有棱对应相同的雪花(棱有顺序要求). 要点: 刚自学了一下hash,这题刚上手有点思路但自己实在也写不出来,看了网上的代码觉得还是 ...
最新文章
- dubbo相关的知识点总结
- html-webpack-plugin插件 根据模板生成多页面
- 【Tools】Ubuntu中vscode安装和使用
- 如何做好工程监理控制工作?
- PyCharm+Python3转换xls文件为xlsx文件格式
- atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践
- 【廖雪峰python基础】【切片】课后作业
- SOME/IP报文格式-Payload
- python:实现峰值信噪比算法(附完整源码)
- 使用ID3算法实现决策树
- 用java 把字符串写进文本,Java将字符串写入文本文件代码示例
- 大一上学期C语言不熟知识点学习总结
- Windows版微信3.3.0内测版更新啦,亲测可刷朋友圈(附内测版)
- firewalld防火墙(二)实验案例:ip地址伪装,端口转发
- 学习计算机软件技术感想,信息技术学习心得体会
- mybatis的example
- 爬了1000张清纯妹子私房照,我流鼻血了...
- 【附源码】计算机毕业设计java智慧校园防疫管理平台设计与实现
- Milking Cows UASCO
- [附源码]计算机毕业设计4S店汽车售后服务管理系统Springboot程序
热门文章
- PDPS软件:导出Web浏览器文件功能及其操作方法
- Java处理JSON数据返回到前端的反斜杠
- 优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
- VSCode安装教程【Windows系统】
- [YOLO专题-11]:YOLO V5 - ultralytics/train基于自定义图片数据集重新训练网络, 完成自己的目标检测
- uo和o的区别和用法_拼音o与uo如何区别使用
- 数模学习第三天--微分方程(传染病模型)
- 运行数据区③---方法区
- 又是一年冬至,最喜欢吃冬至茧了
- 「项目管理」甘特图制定项目计划的方法