最近在对照省选知识点自己的技能树 今天是Hash

题面

大概是给定有n个6元序列

定义两个序列相等 当两个序列各自从某一个元素开始顺时针或者逆时针旋转排列能得到两个相同的序列

求这n个6元序列中是否有相等的序列

解释相等序列的样例

顺时针:如 1 2 3 4 5 6 与 2 3 4 5 6 1 相等

逆时针:如 1 2 3 4 5 6 与 6 5 4 3 2 1 相等

算法

对于各种类型的数列 字符串是否相等问题我们都可以用Hash解决

我们对一个序列A 定义其哈希值为 \(H(A) = (\sum^{6}_{j = 1}A_{i,j} + \prod^{6}_{j = 1}A_{i,j}) mod P\)

P的取值稍后讨论

我们知道对于组成数字一样的两个序列A和B 显然有\(H(A) = H(B)\)

我们用领接表来存储这些哈希值相等的序列在总序列中的下标,然后我们把当前序列A与在哈希表中哈希值同A一样的序列进行比较即可

如果没有匹配的 我们则把A的首个元素下标 存入哈希表

P的取值

在哈希表中 我们通常取P与数据范围N接近的质数 这样可以让哈希表尽量的均匀 可以提高查找效率 这里最大的数据范围是 600000 我们取\(P = 517619\)

代码

#include <iostream>
#include <cstdio>
#define ll long long
#define M 600010
#define MOD 517619
using namespace std;
ll num[M], n, head[M];
struct P {
ll biao, next;
} lian[M];
bool cheek(ll n1, ll n2) {
bool p;
for (ll i = 1; i <= 6; i++) //顺
{
p = 1;
for (ll j = 1; j <= 6; j++) {
ll now = n1 + (i + j - 1) % 6;
if (num[now] != num[n2 + j - 1]) {
p = 0;
break;
}
}
if (p)
return 1;
}
for (ll i = 1; i <= 6; i++) //逆
{
p = 1;
for (ll j = 1; j <= 6; j++) {
ll now = n1 + (i + j - 1) % 6;
if (num[now] != num[n2 + 6 - j]) {
p = 0;
break;
}
}
if (p)
return 1;
}
return 0;
}
bool insert(ll num, ll front) {
ll now = head[num];
if (now == 0) {
lian[++lian[0].biao].biao = front;
lian[lian[0].biao].next = head[num];
head[num] = lian[0].biao;
return 0;
} else
for (; now; now = lian[now].next) {
if (cheek(lian[now].biao, front))
return 1;
}
lian[++lian[0].biao].biao = front;
lian[lian[0].biao].next = head[num];
head[num] = lian[0].biao;
return 0;
}
int main() {
scanf("%lld", &n);
for (ll i = 1; i <= 6 * n; i += 6) {
ll sum = 0;
ll cheng = 1;
for (ll j = 1; j <= 6; j++) {
scanf("%lld", &num[i + j - 1]);
sum = (sum + num[i + j - 1]) % MOD;
cheng = (cheng * num[i + j - 1]) % MOD;
}
ll key = (sum + cheng) % MOD;
if (insert(key, i)) {
puts("Twin snowflakes found.");
return 0;
}
}
puts("No two snowflakes are alike.");
} ```(奇怪 代码块渲染出了点问题)

【POJ3349 Snowflake Snow Snowflakes】【Hash表】的更多相关文章

  1. POJ3349: Snowflake Snow Snowflakes(hash 表)

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

  2. [poj3349]Snowflake Snow Snowflakes(hash)

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

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

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

  4. poj3349 Snowflake Snow Snowflakes【HASH】

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

  5. POJ3349 Snowflake Snow Snowflakes (hash

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

  6. POJ3349 Snowflake Snow Snowflakes 【哈希表】

    题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...

  7. poj3349 Snowflake Snow Snowflakes —— 哈希表

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

  8. poj3349 Snowflake Snow Snowflakes

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

  9. POJ 3349 Snowflake Snow Snowflakes Hash

    题目链接: http://poj.org/problem?id=3349 #include <stdio.h> #include <string.h> #include < ...

随机推荐

  1. python的函数参数传递方式

    python的一切数据类型都是对象.但是python的对象分为不可变对象和可变对象.python的变量是引用,对python变量的赋值是引用去绑定该对象. 可变对象的数据发生改变,例如列表和字典,引用 ...

  2. I-Base62

    I - Base62 PS:一个任意进制转换的大数问题 传送门:Base62 短除法原理: 20(10进制) => 202(3进制) 20 = (2 * 3 ^ 2 + 0 * 3 ^ 1 + ...

  3. [软工顶级理解组] Alpha阶段测试报告

    [软工顶级理解组] Alpha阶段测试报告 在测试过程中发现了多少Bug? 测试阶段发现并已修复的bug: 尚且存在,但是难以解决或者不影响使用的bug: 计算重修课程的时候,如果重修课程的课程号和原 ...

  4. UltraSoft - Beta - Scrum Meeting 6

    Date: May 22n'd, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 修复了DDL日程自动发邮件被服务器"吞掉"的bug后端增加了 ...

  5. python基础语法--字典的遍历

    原文链接:https://blog.csdn.net/normang/article/details/55804231 (1)遍历key值 >>> a {'a': '1', 'b': ...

  6. mybatis竟然报"Invalid value for getInt()"

    目录 背景 场景 初探 再探 结局 背景 使用mybatis遇到一个非常奇葩的问题,错误如下: Cause: org.apache.ibatis.executor.result.ResultMapEx ...

  7. jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例

    本文实例讲述了jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能.分享给大家供大家参考,具体如下: 弹出层:两种方式 一是打开网页就自动弹出层二是点击弹出 <!DOCTYPE html ...

  8. 转:(WIN)S04-CH01 PCIE XDMA开发环境搭建以及环路测试

    摘要: 这一章开始主要介绍 XILINX FPGA PICE IP XDMA IP的使用.XDMA IP使用部分教程分LINUX 篇和WINDOWS篇两个部分.通过实战,面向应用,提供给大家 XILI ...

  9. React + 导入模块的一个错误

    导入模块的时候出现这个错误: Attempted import error: 'd3' does not contain a default export (imported as 'd3'). 把导 ...

  10. K8S 部署 SpringBoot 项目(一篇够用)

    现在比较多的互联网公司都在尝试将微服务迁到云上,这样的能够通过一些成熟的云容器管理平台更为方便地管理微服务集群,从而提高微服务的稳定性,同时也能较好地提升团队开发效率. 但是迁云存在一定的技术难点,今 ...