[poj3349]Snowflake Snow Snowflakes_hash
Snowflake Snow Snowflakes poj-3349
题目大意:给出n片雪花,每片雪花有6个角,每个角有一个权值。如果两片雪花中能够各选出一个点,使得从该点顺时针或者逆时针转,得到的权值序列完全相符,那么我们就说这两片雪花是完全相同的。
注释:$1\le n\le 10^5$。
想法:其实并不是一道真正意义上的hash。我们对每个雪花进行处理:如果两个雪花a,b,满足:
$\sum\limits_{i=1}^{6} a_i+\prod\limits_{i=1}^{6}a_i$相等,我们就说这两片雪花是相等的。
之后,用链表遍历上述值相等的雪花即可,这道题我们选择在线处理(orz lyd)。
最后,附上丑陋的代码... ...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#define SIZE 100010
#define mod 49999
using namespace std;
typedef long long ll;
int snow[SIZE][6],head[SIZE],nxt[SIZE];
int n;
int Hash(int *a)
{
int sum=0,mul=1;
for(int i=0;i<6;i++)
{
sum=(sum+a[i])%mod;
mul=(ll)mul*a[i]%mod;
}
return (sum+mul)%mod;
}
bool equal(int *a,int *b)
{
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
bool flag=1;
for(int k=0;k<6;k++)
{
if(a[(i+k)%6]!=b[(j+k)%6]) flag=false;
}
if(flag) return true;
flag=true;
for(int k=0;k<6;k++)
{
if(a[(i+k)%6]!=b[(j-k+6)%6]) flag=false;
}
if(flag) return true;
}
}
return false;
}
int tot;
bool insert(int *a)
{
int val=Hash(a);
for(int i=head[val];i;i=nxt[i])
{
if(equal(snow[i],a)) return true;
}
++tot;
memcpy(snow[tot],a,6*sizeof(int));
nxt[tot]=head[val];
head[val]=tot;
return false;
}
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
int a[10];
for(int j=0;j<6;j++)
{
scanf("%d",&a[j]);
}
if(insert(a))
{
puts("Twin snowflakes found.");
return 0;
}
}
puts("No two snowflakes are alike.");
return 0;
}
小结:hash好强啊,精髓在于将字符串等价成整数,所以方便处理。
[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 ...
- POJ-3349 Snowflake Snow Snowflakes---最小表示法
题目链接: https://vjudge.net/problem/POJ-3349 题目大意: 每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的.输 ...
- poj3349 Snowflake Snow Snowflakes
吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...
- POJ3349 Snowflake Snow Snowflakes (JAVA)
首先声明代码并没有AC,内存超了 但我对此无能为力,有没有哪位大神好心教一下怎么写 哈希,然后比较花瓣数组,这些应该都没问题才对..唉.. 贴MLE代码 import java.util.*; pub ...
- poj3349 Snowflake Snow Snowflakes —— 哈希表
题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...
- POJ3349: Snowflake Snow Snowflakes(hash 表)
考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总 ...
随机推荐
- HTML多表头表格
1.多表头表格代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
- Excel 2010高级应用-饼图(四)
Excel 2010高级应用-饼图(四) 基本操作如下: 1.新建空白文档,并命名饼图 2.单击"插入",找到饼图样例图 3.选择其中一种饼图图例,单击并在空白文档上生成饼图图框 ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown database 'smvch'
1.错误描述 INFO:2015-05-01 14:20:44[main] - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDat ...
- 第九篇:随机森林(Random Forest)
前言 随机森林非常像<机器学习实践>里面提到过的那个AdaBoost算法,但区别在于它没有迭代,还有就是森林里的树长度不限制. 因为它是没有迭代过程的,不像AdaBoost那样需要迭代,不 ...
- 踩坑系列の Oracle dbms_job简单使用
二话不说先上代码 --创建存储过程 create or replace procedure job_truncateState is begin --此处就是要定时执行的sql execute imm ...
- JVM堆外内存随笔
一 JVM堆外内存 1)java与io(file,socket)的操作都需要堆外内存与jvm内存进行互相拷贝,因为操作系统是不懂jvm的内存结构的(jvm的内存结构是自管理的),所以堆外内存存放的是操 ...
- js命名中的关键字整理
- vue使用 better-scroll的参数和方法
格式:var obj = new BScroll(object,{[option1,],.,.}); 注意: 1.要确保object元素的高度比其父元素高 2.使用时,一定要确保object所在的do ...
- 第一周Python讲课内容--日记
1.python的发展史,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年...... 2.第一个helloword程序的开始 3.变量的含义,赋值传参数的作 ...
- TCP 连接关闭及TIME_WAIT探究
这里主要记录一下TCP连接在关闭的时刻,有哪些细节问题.方便在以后的程序设计中能够注意这些细节, 以避免出现这些错误.首先我们来看一下TCP的状态转换图.如<unix网络编程>卷一所示如下 ...