【POJ3349 Snowflake Snow Snowflakes】【Hash表】
最近在对照省选知识点自己的技能树 今天是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表】的更多相关文章
- POJ3349: Snowflake Snow Snowflakes(hash 表)
考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总 ...
- [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 ...
- POJ3349 Snowflake Snow Snowflakes 【哈希表】
题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...
- poj3349 Snowflake Snow Snowflakes —— 哈希表
题目链接:http://poj.org/problem?id=3349 题意:雪花有6个瓣,有n个雪花,输入每个雪花的瓣长,判断是否有一模一样的雪花(通过旋转或翻转最终一样,即瓣长对应相等).如果前面 ...
- poj3349 Snowflake Snow Snowflakes
吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...
- POJ 3349 Snowflake Snow Snowflakes Hash
题目链接: http://poj.org/problem?id=3349 #include <stdio.h> #include <string.h> #include < ...
随机推荐
- [源码解析] PyTorch如何实现前向传播(3) --- 具体实现
[源码解析] PyTorch如何实现前向传播(3) --- 具体实现 目录 [源码解析] PyTorch如何实现前向传播(3) --- 具体实现 0x00 摘要 0x01 计算图 1.1 图的相关类 ...
- 【UE4】虚幻引擎技术直播汇总(含中英文直播)
B站虚幻引擎官方账号 中文直播 [中文直播]第35期 | 使用GIS在UE中创造真实地球风貌 | Epic 周澄清 [中文直播]第34期 | 包教包会的Epic MegaGrants申请之道 | Ep ...
- 6. 站在巨人的肩膀学习Java Filter型内存马
本文站在巨人的肩膀学习Java Filter型内存马,文章里面的链接以及图片引用于下面文章,参考文章: <Tomcat 内存马学习(一):Filter型> <tomcat无文件内存w ...
- [no code][scrum meeting] Alpha 15
项目 内容 会议时间 2020-04-23 会议主题 OCR紧急会议 会议时长 45min 参会人员 PM + OCR组(赵涛,黎正宇) 项目 内容 会议时间 2020-04-24 会议主题 全体测试 ...
- BUAA软件工程:软件案例分析
BUAA软件工程:软件案例分析 Author:17373015 乔玺华 项目 内容 这个作业属于哪个课程 2020计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析博客作业 我在这个 ...
- 面试不再慌,终于有人把TCP讲明白了。。。
前言 TCP(Transmission Control Protocol,传输控制协议) 是计算机网络的的重要组成部分,也是网络编程的重要内容,还有我们平时接触最多的 HTTP 也是基于 TCP 实现 ...
- git常用的一些简单命令
1.如果一个文件被修改了,但是还没有使用 git add 命令,此时想取消这次修改,需要执行的命令如下: git checkout -- 文件名 2.如果一个文件执行了 git add ,此时想取消这 ...
- Noip模拟22 2021.7.21
T1 d 简化题意就是找到相对平均长宽的偏移量较大的矩形给他删掉 可以说是个贪心,按照a,b分别为第一关键字排序 然后假装删去要求的那么多个按a排序的较小的,然后再去b中, 找到 删去的a中的那几个矩 ...
- 利用DMA实现采样数据的直接搬运存储
尝试了下STM32的ADC采样,并利用DMA实现采样数据的直接搬运存储,这样就不用CPU去参与操作了. 找了不少例子参考,ADC和DMA的设置了解了个大概,并直接利用开发板来做一些实验来验证相关的操作 ...
- error: unsupported reloc 43
在Ubuntu 16.04.5 LTS编译android 5.1报错 [19:17:13.062]libnativehelper/JniInvocation.cpp:165: error: unsup ...