Hash (poj2002-Squares & poj3349-Snowflake Snow Snowflakes)
//突然发现好弱,好多基础的算法竟然都不会,哈希这种经典的算法,我貌似基本没怎么做过相关的题0.0
题意:给n个点,问有多少组四个点能组成正方形。
题解:枚举两个点,通过公式算出另外两个点,然后通过哈希查找另外两个点存不存在。
公式是抄网上的,哈希直接用了vector存的,反正时限3500ms
点的哈希就是(x^2+y^2)%MOD
AC代码:
/**************************************
Memory: 924 KB Time: 969 MS
Language: G++ Result: Accepted
**************************************/
#include <cstdio>
#include <cstring>
#include <vector> using namespace std; const int MOD = ;
const int N = ; struct Point {
int x, y;
int key;
} p[N]; int cal(int x, int y) {
return (x*x+y*y) % MOD;
} vector<int> vec[MOD]; void insert(int x) {
vec[p[x].key].push_back(x);
} bool find(int x, int y) {
int k = cal(x, y);
for (unsigned i = ; i < vec[k].size(); ++i) {
int v = vec[k][i];
if (x == p[v].x && y == p[v].y) return true;
}
return false;
} int main() {
//freopen("in", "r", stdin);
int n;
while (~scanf("%d", &n) && n) {
for (int i = ; i < MOD; ++i) vec[i].clear();
for (int i = ; i < n; ++i) {
scanf("%d%d", &p[i].x, &p[i].y);
p[i].key = cal(p[i].x, p[i].y);
insert(i);
}
int ans = ;
for (int i = ; i < n; ++i) {
for (int j = ; j < n; ++j) {
if (i == j) continue;
int x1 = p[i].x-p[j].y+p[i].y;
int y1 = p[i].y+p[j].x-p[i].x;
int x2 = p[j].x-p[j].y+p[i].y;
int y2 = p[j].y+p[j].x-p[i].x;
if (find(x1,y1) && find(x2,y2)) ++ans;
}
}
printf("%d\n", ans/);
}
return ;
}
求有没有相同的雪花,每个雪花有12中hash值,分别试一次,插入一个就可以了。时间复杂度O(n*12)。
本来用的上面vector的,然后T了好久T^T
后来改成了类似存图时前向星的方法,3438ms水过去了。
#include <cstdio>
#include <cstring>
#include <vector> using namespace std; const int MOD = ;
const int MAXN = ;
const int N = ; int snow[MAXN][N];
int head[MOD];
int nt[MAXN];
int cnt; void insert(int a[], int x) {
for (int i = ; i < N; ++i) snow[cnt][i] = a[i];
nt[cnt] = head[x];
head[x] = cnt++;
} bool find(int a[], int x) {
//printf("%d %d\n", x, head[x]);
for (int i = head[x]; i != -; i = nt[i]) {
//printf("i=%d\n", i); break;
for (int j = ; j < N; ++j) {
if (a[j] != snow[i][j]) break;
if (j == N-) return true;
}
}
return false;
} int main() {
//freopen("in", "r", stdin);
int n;
while (~scanf("%d", &n) && n) {
cnt = ;
bool fg = false;
memset(head, -, sizeof head);
int a[], b[];
for (int i = ; i < n; ++i) {
for (int i = ; i < N; ++i) scanf("%d", a+i);
if (fg) continue;
int val = ;
for (int i = ; i < N; ++i) {
val = ;
for (int j = ; j < N; ++j) {
val = (val * + a[(i+j)%N]) % MOD;
b[j] = a[(i+j)%N];
}
if (find(b, val)) { fg = true; break; }
val = ;
for (int j = N-; j >= ; --j) {
b[N-j-] = a[(i+j)%N];
val = (val * + a[(i+j)%N]) % MOD;
}
if (find(b, val)) { fg = true; break; }
}
if(!fg) insert(b, val);
}
if (fg) puts("Twin snowflakes found.");
else puts("No two snowflakes are alike."); }
return ;
}
Hash (poj2002-Squares & poj3349-Snowflake Snow Snowflakes)的更多相关文章
- [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(hash 表)
考察hash表: 每一个雪花都有各自的6个arm值,如果两个雪花从相同或者不同位置开始顺时针数或者逆时针数可以匹配上,那么这两个雪花就是相等的. 我们采用hash的方法,这样每次查询用时为O(1),总 ...
- 【POJ3349 Snowflake Snow Snowflakes】【Hash表】
最近在对照省选知识点自己的技能树 今天是Hash 题面 大概是给定有n个6元序列 定义两个序列相等 当两个序列各自从某一个元素开始顺时针或者逆时针旋转排列能得到两个相同的序列 求这n个6元序列中是否有 ...
- poj3349 Snowflake Snow Snowflakes
吼哇! 关于开散列哈希: 哈希就是把xxx对应到一个数字的东西,可以理解成一个map<xxx, int>(是不是比喻反了) 我们要设计一个函数,这个函数要确保同一个东西能得到相同的函数值( ...
- POJ3349 Snowflake Snow Snowflakes (JAVA)
首先声明代码并没有AC,内存超了 但我对此无能为力,有没有哪位大神好心教一下怎么写 哈希,然后比较花瓣数组,这些应该都没问题才对..唉.. 贴MLE代码 import java.util.*; pub ...
- POJ3349 Snowflake Snow Snowflakes(哈希)
题目链接. 分析: 哈希竟然能这么用.检查两片雪花是否相同不难,但如果是直接暴力,定会超时.所以要求哈希值相同时再检查. AC代码: #include <iostream> #includ ...
- POJ3349 Snowflake Snow Snowflakes 【哈希表】
题目 很简单,给一堆6元组,可以从任意位置开始往任意方向读,问有没有两个相同的6元组 题解 hash表入门题 先把一个六元组的积 + 和取模作为hash值,然后查表即可 期望\(O(n)\) #inc ...
随机推荐
- iOS开发笔记--宏定义的黑魔法 - 宏菜鸟起飞手册
宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在 ...
- 安装Redis完整过程
概述 首先报告一下我系统的版本: [root@firefish init.d]# cat /etc/issue 系统版本信息如下: 引用 CentOS release 6.4 (Final) K ...
- linux ln命令 创建链接(快捷方式)
命令格式: ln -s 目标地址 链接名称 # 假设/home目录下有wuyou文件夹,你要在当前目录创建一个链接指向它 $ ln -s /home/wuyou wuyou_link
- Map.entrySet() 简介
转载:http://blog.csdn.net/mageshuai/article/details/3523116 今天看Think in java 的GUI这一章的时候,里面的TextArea这个例 ...
- like 大数据字段 查询慢
对于ntext的字段,作为查询条件的时候速度会很慢,比如以下语句: select * from T_KNOWLEDGE where CONTENTS like '%Oracle TimesTen In ...
- 二维图形的矩阵变换(三)——在WPF中的应用矩阵变换
原文:二维图形的矩阵变换(三)--在WPF中的应用矩阵变换 UIElement和RenderTransform 首先,我们来看看什么样的对象可以进行变换.在WPF中,用于呈现给用户的对象的基类为Vis ...
- JVM运行机制
JVM启动流程
- IntelliJ idea 中使用Git
1.要使用GitHub,首先你需要下载一个Git(地址:http://windows.github.com/)这里使用的是for Windows,然后安装完成会得到如下的一个目录:
- 转:Build Your First JavaScript Library
http://net.tutsplus.com/tutorials/javascript-ajax/build-your-first-javascript-library/ Step 1: Creat ...
- Why it is good practice to declare loggers private, static, and final?
// Jakarta Commons Loggingprivate static final Log log = LogFactory.getLog(MyClass.class);The above ...