日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ-1840 Eqs Hash表

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。