POJ-1840 Eqs Hash表
不得不说上次看得的这句话是多么对,再差的Hash表都比map好,hash表的查找速度可不是logn能够比的。
首先将5个部分拆成2+3,我们选取2的部分进行hash,然后再进行3重for循环。
动态申请内存还是比不上静态的啊。
代码如下:
动态申请内存:
#include <cstdio> #include <cstring> #include <cstdlib> #define MOD 20003 using namespace std;int rec[105];struct Node {int x;Node *next; }e[20003];void Hash(int key) { Node *p = &e[abs(key)%MOD];Node *q = new Node;q->x = key;q->next = p->next;p->next = q; }int find(int key) {int ans = 0;Node *p = &e[abs(key) % MOD];while (p != NULL) {if (p->x == key) {++ans;}p = p->next;}return ans; }int main() {int a, b, c, d, e, ans, x; for (int i = -50; i <= 50; ++i) {rec[i+50] = i*i*i;}while (scanf("%d%d%d%d%d", &a, &b, &c, &d, &e) == 5) {ans = 0;for (int i = -50; i <= 50; ++i) {for (int j = -50; j <= 50; ++j) {x = -(a * rec[i+50] + b * rec[j+50]);if (i != 0 && j != 0) {Hash(x); }}}for (int i = -50; i <= 50; ++i) {// printf("i = %d\n", i);for (int j = -50; j <= 50; ++j) {for (int k = -50; k <= 50; ++k) {if (i != 0 && j != 0 && k != 0) {x = c * rec[i+50] + d * rec[j+50] + e * rec[k+50];ans += find(x);}}}}printf("%d\n", ans);}return 0; }
静态:
#include <cstdio> #include <cstring> #include <cstdlib> #define MOD 20003 using namespace std;int rec[105], idx;struct Node {int x, cnt, next; }e[20003];int head[20003];void Hash(int key) { int flag = 0, x = key;key = abs(key) % MOD;for (int i = head[key]; i != -1; i = e[i].next) {if (e[i].x == x) {flag = 1;++e[i].cnt;}}if (!flag) {++idx;e[idx].x = x, e[idx].cnt = 1;e[idx].next = head[key];head[key] = idx;} }int find(int key) {int ans = 0, x = key;key = abs(key) % MOD; for (int i = head[key]; i != -1; i = e[i].next) {if (e[i].x == x) {ans += e[i].cnt;}}return ans; }int main() {int a, b, c, d, e, ans, x; for (int i = -50; i <= 50; ++i) {rec[i+50] = i*i*i;}while (scanf("%d%d%d%d%d", &a, &b, &c, &d, &e) == 5) {memset(head, 0xff, sizeof (head));idx = -1;ans = 0;for (int i = -50; i <= 50; ++i) {for (int j = -50; j <= 50; ++j) {x = -(a * rec[i+50] + b * rec[j+50]);if (i != 0 && j != 0) {Hash(x); }}}for (int i = -50; i <= 50; ++i) {for (int j = -50; j <= 50; ++j) {for (int k = -50; k <= 50; ++k) {if (i != 0 && j != 0 && k != 0) {x = c * rec[i+50] + d * rec[j+50] + e * rec[k+50];ans += find(x);}}}}printf("%d\n", ans);}return 0; }
转载于:https://www.cnblogs.com/Lyush/archive/2012/07/12/2587569.html
POJ-1840 Eqs Hash表相关推荐
- poj 1840 Eqs
题目连接 http://poj.org/problem?id=1840 Eqs Description Consider equations having the following form: a ...
- POJ 1840 Eqs 解方程式, 水题 难度:0
题目 http://poj.org/problem?id=1840 题意 给 与数组a[5],其中-50<=a[i]<=50,0<=i<5,求有多少组不同的x[5],使得a[0 ...
- 【POJ 3274】Gold Balanced Lineup (stl map )设计hash表,处理碰撞
题目链接 题目链接 http://poj.org/problem?id=3274 题意 输入每头牛的特征的10进制,若i~j头牛中每个数位的特征相等则满足要求,求所有满足要求的j-i的最大值. 解题思 ...
- 从头到尾彻底解析Hash表算法
从头到尾彻底解析Hash表算法 发布时间: 2013-10-02 10:26 阅读: 25156 次 推荐: 14 原文链接 [收藏] 作者:July.wuliming.pkuoliv ...
- 0x14.基础数据结构 — hash表与字符串hash
目录 一.Hash表 1.AcWing 137. 雪花雪花雪花 0.hash表+链表 1.字符串的最小表示法 二.字符串hashhashhash 0.AcWing 138. 兔子与兔子 1.luogu ...
- 一步一步写算法(之hash表)
[ 声明:版权全部,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...
- 转 从头到尾彻底解析Hash表算法
出处:http://blog.csdn.net/v_JULY_v. 说明:本文分为三部分内容, 第一部分为一道百度面试题Top K算法的详解:第二部分为关于Hash表算法的详细阐述:第三部 ...
- C++实现Hash表
C++实现Hash表的插入,删除,重建开放寻址法 #include<iostream> using namespace std; typedef int KeyType; / ...
- hash表建立 很久没写数据结构了
/** auhtor:lx date 4.9 2011 brief hash table */ #include <stdio.h> #include <stdlib.h> # ...
最新文章
- 8个实用而有趣Bash命令提示行
- RabbitMQ 最常用的三大模式
- 直接用自己服务器做图床可以吗_我花 9 块钱搭了一个“私人图床”
- c# Task.Factory.StartNew 传参数_C#/C++混合编程一二事
- 互联网基建成果,快速实现一个clubhouse要多久
- Jquery自定义分页插件
- 检测文件是否有BOM 头,并删除BOM头(php)
- 程序设计与算法----动态规划之最长上升子序列
- Struts2 stracture
- C++_运算符重载 再思考
- 如何让遮罩层悬浮在object标签中
- PDF文档阅读必备的PDF阅读器
- 从ISSCC2021论文看未来技术发展趋势
- MFC中资源视图中对话框大小和实际像素尺寸显示问题
- html水平线变虚线,html水平线 虚线
- 1N4148的导通电压
- DQN、DDQN、Dueling DQN、PER DQN
- 使用rrdtool统计网站PV和IP
- 解读符合新时代主流的创客教育模式
- 树莓派4b署filebrowser+aria2