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 ...
随机推荐
- static函数与普通函数
转自http://blog.163.com/sunshine_linting/blog/static/44893323201191294825184/ 全局变量(外部变量)的说明之前再冠以static ...
- C++11多线程教学(一)
本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://s ...
- HDU4628+状态压缩DP
/* 状态压缩DP dp[ i ]:达到i状态的最小step. 题意:每次可以去掉一个回文串,求最少几步能取完. */ #include<stdio.h> #include<stri ...
- java信号量PV操作 解决生产者-消费者问题
package test1; /** * 该例子演示生产者和消费者的问题(设只有一个缓存空间.一个消费者和一个生产者) * MySystem类定义了缓冲区个数以及信号量 * @author HYY * ...
- 李洪强iOS开发之拓展篇—UIDynamic(简单介绍)
iOS开发拓展篇—UIDynamic(简单介绍) 一.简单介绍 1.什么是UIDynamic UIDynamic是从iOS 7开始引入的一种新技术,隶属于UIKit框架 可以认为是一种物理引擎,能 ...
- Java基于Servlet过虑器
- WinAPI——钩子函数大全3
函数原形:LRESULT CALLBACK JournalPlaybackProc(int code, WPARAM wParam, LPARAM lParam); 参数: code:指示一个代码,被 ...
- Windows CE,你妈吗喊你在多核上玩玩
转自:http://hezongjian.com/blog/?p=9693 众所周知,CE的内核是完全重新写的,与9x根nt没有任何关系,这给CE带来了较好的实时性及灵活性.从诞生之日起,CE的内核改 ...
- mysqld -install命令时出现install/remove of the service denied错误的原因和解决办法
原因:没有使用管理员权限 解决方法:使用管理员权限打开cmd,然后运行mysqld -install,服务安装成功
- ASP.NET的六种验证控件的使用
C# 中的验证控件分为一下六种 :1 CompareValidator:比较验证,两个字段的值是否相等,比如判断用户输入的密码和确认密码是否一致,则可以用改控件: 2 CustomValidator ...