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 ...
随机推荐
- DIY时钟类--广州百田笔试之一
2014.05.30 武汉华科大活 题目:(原题不记得,大概回忆)用户输入一个时间,输出下一个时间 这个小题看似不难,实际处理起来对date的处理稍微繁琐,每月有30,31,28,29(闰年的判断)天 ...
- openvas
http://www.freebuf.com/articles/5474.html EPEL http://www.centoscn.com/CentOS/config/2014/0920/3793. ...
- linux压缩文件(夹) zip uzip命令的用法
压缩文件(夹) # 压缩列举的文件,格式如下: zip 压缩包名称 文件1 文件2 文件3 ... # 压缩test.txt, a.out文件,并取名为abc.zip $ zip abc.zip te ...
- Android:控件布局(线性布局)LinearLayout
LinearLayout是线性布局控件:要么横向排布,要么竖向排布 决定性属性:必须有的! android:orientation:vertical (垂直方向) .horizontal(水平方向) ...
- Android安全问题 抢先拦截短信
同上篇文章一样,这里只陈述结果,代码分析稍后给出 导读:本文叙述如何先于某些伪杀毒软件.病毒.常规软件获取到短信 众所周知,android系统在收到短信息的时候会发送广播,但是此广播是有序广播,也就是 ...
- Java API ——包装类
1.包装类的概述 · 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. · 常用的操作之一:用于基本数据类型与字符串之间的转换. · 基本类型和包装类的对应 为了对基本数据 ...
- Export BOM - BOMPXINQ.EXPLODER_USEREXIT API
--======================================================================== -- Procedure : explode ...
- Android开发之json解析
目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...
- git commit 之后 push 之前,想删除 个别的commit 文件
git rm --cached <file_name> git commit "删除了<file_name>文件" git rm --cached < ...
- struts采用JavaServlet/JSP技术,实现了基于Java EEWeb应用的MVC设计模式的应用框架
今天我用Ecipse搭建Struts框架,并且使用Struts框架编写一个最简单的例子,相信读者能够很容易的明白. Struts是当今Java比较流行的三大框架之一,三大框架是Struts,sprin ...