//突然发现好弱,好多基础的算法竟然都不会,哈希这种经典的算法,我貌似基本没怎么做过相关的题0.0

POJ2002

题意:给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 ;
}

  

POJ3349

求有没有相同的雪花,每个雪花有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)的更多相关文章

  1. [poj3349]Snowflake Snow Snowflakes(hash)

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

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

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

  3. poj3349 Snowflake Snow Snowflakes【HASH】

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

  4. POJ3349 Snowflake Snow Snowflakes (hash

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

  5. POJ3349: Snowflake Snow Snowflakes(hash 表)

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

  6. 【POJ3349 Snowflake Snow Snowflakes】【Hash表】

    最近在对照省选知识点自己的技能树 今天是Hash 题面 大概是给定有n个6元序列 定义两个序列相等 当两个序列各自从某一个元素开始顺时针或者逆时针旋转排列能得到两个相同的序列 求这n个6元序列中是否有 ...

  7. poj3349 Snowflake Snow Snowflakes

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

  8. POJ3349 Snowflake Snow Snowflakes (JAVA)

    首先声明代码并没有AC,内存超了 但我对此无能为力,有没有哪位大神好心教一下怎么写 哈希,然后比较花瓣数组,这些应该都没问题才对..唉.. 贴MLE代码 import java.util.*; pub ...

  9. POJ3349 Snowflake Snow Snowflakes(哈希)

    题目链接. 分析: 哈希竟然能这么用.检查两片雪花是否相同不难,但如果是直接暴力,定会超时.所以要求哈希值相同时再检查. AC代码: #include <iostream> #includ ...

  10. POJ3349 Snowflake Snow Snowflakes 【哈希表】

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

随机推荐

  1. UIcollectionView的使用(首页的搭建2)

    2.2 直接购买的UIcollectionCell 2.2.1创建CFPromptBuyCell,继承自UICollectionViewCell,定义了标题和图片两个属性 2.2.2 在.m文件中定义 ...

  2. [itint5]区间相交

    http://www.itint5.com/oj/#14 要记录原来的索引,所以用了额外的空间,新生成一个结构.如果要省空间,可以用指针来排序,最后拿指针减去索引0的位置就是index,见:http: ...

  3. 验证Android用户输入日期

    如何验证用户输入的日期是有效还是无效? private Pattern pattern; private Matcher matcher; private static final String DA ...

  4. org.apache.http.ProtocolException: Target host is not specified

    对于httpClient4.3访问指定页面,可以从下面的demo抽取方法使用. 注意:对于URL必须使用 http://开始,否则会有如下报错信息: Caused by: org.apache.htt ...

  5. Ubuntu 12.04上编译Vim7.4的时候遇到“no terminal library found”问题

    错误如下: no terminal library foundchecking for tgetent()... configure: error: NOT FOUND!      You need ...

  6. CodeWars题目筛选

    http://www.codewars.com/kata/search/csharp?q=&r%5B%5D=-8&xids=completed&beta=false 语言选择C ...

  7. Switch基本知识

    关于java中switch使用的一些说明 switch(表达式){case 常量表达式1:语句1;....case 常量表达式2:语句2;default:语句;}default就是如果没有符合的cas ...

  8. bzoj3774

    这算是最小割中比较难的吧 看到选取显然最小割 看到上下左右四个点我感觉肯定和染色相关 注意每个点的收益获得条件是[或],因此我们考虑拆点i', i,分别表示通过四周控制和控制本身的代价 连边s--&g ...

  9. SSMS错误代码大全

    0 操作成功完成. 1 功能错误. 2 系统找不到指定的文件. 3 系统找不到指定的路径. 4 系统无法打开文件. 5 拒绝访问. 6 句柄无效. 7 存储控制块被损坏. 8 存储空间不足,无法处理此 ...

  10. HDU 1533 Going Home (最小费用流)

    题意: 一个矩阵n*m,其中有k个房子和k个人,k个人分别必须走到任意一个房子中(匹配),但是权值就是长度(非欧拉距离),求匹配完的权之和. 思路: 建图方法是,首先将k个人和k个房子分别抽出来到集合 ...