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的更多相关文章

  1. [poj3349]Snowflake Snow Snowflakes(hash)

    Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 37615 Accepted: ...

  2. POJ--3349 Snowflake Snow Snowflakes(数字hash)

    链接:Snowflake Snow Snowflakes 判断所有的雪花里面有没有相同的 每次把雪花每个角的值进行相加和相乘 之后hash #include<iostream> #incl ...

  3. poj3349 Snowflake Snow Snowflakes【HASH】

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

  4. POJ3349 Snowflake Snow Snowflakes (hash

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

  5. POJ-3349 Snowflake Snow Snowflakes---最小表示法

    题目链接: https://vjudge.net/problem/POJ-3349 题目大意: 每个雪花都有六个分支,用六个整数代表,这六个整数是从任意一个分支开始,朝顺时针或逆时针方向遍历得到的.输 ...

  6. poj3349 Snowflake Snow Snowflakes

    吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...

  7. POJ3349 Snowflake Snow Snowflakes (JAVA)

    首先声明代码并没有AC,内存超了 但我对此无能为力,有没有哪位大神好心教一下怎么写 哈希,然后比较花瓣数组,这些应该都没问题才对..唉.. 贴MLE代码 import java.util.*; pub ...

  8. poj3349 Snowflake Snow Snowflakes —— 哈希表

    题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...

  9. POJ3349: Snowflake Snow Snowflakes(hash 表)

    考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总 ...

随机推荐

  1. Anaroid WebView API详解

    android提供了webView控件专门用来浏览网页 使用WebView时,在程序中装载WebView控件,可以把WebView写到布局中,也可以动态New出WebView实例,可以设置属性,比如: ...

  2. R语言︱用excel VBA把xlsx批量转化为csv格式

    笔者寄语:批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入.本章来自博客:http://www.cnblogs.com/weibaar/p/4506144.html 在 ...

  3. visualSFM的使用方法

    VisualSFM是Changchang Wu编写的使用 Structure from Motion (SfM)进行3D重建的交互界面,具体内容详见http://ccwu.me/vsfm/.本人电脑环 ...

  4. USB设备驱动概述

    USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个 ...

  5. C# 时间格式化大全

    DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25        Label2.Text = dt ...

  6. Openstack_后端存储平台Ceph

    框架图 介绍 一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统 特点 CRUSH算法 Crush算法是ceph的两大创新之一,简单来说,ceph摒弃了传统的集中式存储元数据寻址的方案, ...

  7. ASP.NET Core 新核心对象WebHost(一)

    以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...

  8. Eclipse远程debug服务器

    一,找端口号 二,Eclipse配置 三,测试是否成功 四,结束远程debug

  9. ubuntu 更改默认亮度

    chmod 777 /sys/class/backlight/intel_backlight/brightnes chmod 777 /sys/class/backlight/intel_backli ...

  10. python 内置函数range和xrange

    range range 是一种类型(type),它是一个数字的序列,而且是不可变的,通常用在for循环中. class range(stop)class range(start, stop [, st ...