POJ 2549 Sumsets hash值及下标

题目大意:
找到几何中的4个数字使他们能够组成 a+b+c=d , 得到最大的d值

我们很容易想到a+b = d-c

那么将所有a+b的值存入hash表中,然后查找能否在表中找到这样的d-c的值即可

因为4个数字都不能相同,那么我们同时要在hash表中记录相加两个数的下标,然后查找的时候还要进行下标判断

这里用二分查找也可以,但是能用hash还是hash快地多了

这里第一次写到对负数进行hash,还是傻傻地 val%MOD , 但是负数得到的模值为负,作为hash的下标会RE,所以RE了一发,还是看别人的题解才找到这个错误,要谨记

遇到负数要先取绝对值后再hash

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <climits>
 6 using namespace std;
 7 #define N 1010
 8 #define MOD 1000007
 9 #define base 31
10
11 struct HashNode{
12     int val , next;
13     int x , y;
14 }_hash[MOD];
15
16 int head[MOD+5] , k , a[N];
17
18 void insertHash(int key , int x , int y)
19 {
20     int pos = ((key<0)?-key:key)%MOD;
21     _hash[k].val = key , _hash[k].next = head[pos] , _hash[k].x=x , _hash[k].y=y;
22     head[pos] = k++;
23 }
24
25 bool searchHash(int key , int a , int b)
26 {
27     int pos = ((key<0)?-key:key)%MOD;
28     for(int i=head[pos] ; ~i ; i=_hash[i].next){
29         if(key == _hash[i].val){
30             if(a==_hash[i].x||a==_hash[i].y||b==_hash[i].x||b==_hash[i].y) continue;
31             return true;
32         }
33     }
34     return false;
35 }
36
37 bool cmp(int a , int b)
38 {
39     return a>b;
40 }
41
42 int main()
43 {
44     #ifndef ONLINE_JUDGE
45         freopen("a.in" , "r" , stdin);
46     #endif // ONLINE_JUDGE
47     int n;
48     while(scanf("%d" , &n) , n)
49     {
50         memset(head , -1 , sizeof(head));
51         k=0;
52         for(int i=0 ; i<n ; i++) scanf("%d" , &a[i]);
53         sort(a , a+n , cmp);
54         for(int i=0 ; i<n ; i++){
55             for(int j=i+1 ; j<n ; j++){
56                 int v = a[i]+a[j];
57                 insertHash(v , i , j);
58             }
59         }
60         int ret = INT_MIN;
61         for(int i=0 ; i<n ; i++){
62             for(int j=0 ; j<n ; j++){
63                 if(i==j) continue;
64                 int v = a[i]-a[j];
65                 if(searchHash(v , i , j)){
66                     ret = max(ret , a[i]);
67                     break;
68                 }
69             }
70             if(ret!=INT_MIN) break;
71         }
72         if(ret==INT_MIN) printf("no solution\n");
73         else printf("%d\n" , ret);
74     }
75     return 0;
76 }
时间: 2024-11-09 00:11:39

POJ 2549 Sumsets hash值及下标的相关文章

POJ 2549 Sumsets

Sumsets Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10593   Accepted: 2890 Description Given S, a set of integers, find the largest d such that a + b + c = d where a, b, c, and d are distinct elements of S. Input Several S, each cons

poj 2549 --- 传说中的用“桶”防止HASH冲突

http://poj.org/problem?id=2549 维基百科有3Sum算法:https://en.wikipedia.org/wiki/3SUM sort(S); for i=0 to n-3 do a = S[i]; k = i+1; l = n-1; while (k<l) do b = S[k]; c = S[l]; if (a+b+c == 0) then output a, b, c; // Continue search for all triplet combinatio

POJ 1840 Eqs(hash)

题意  输入a1,a2,a3,a4,a5  求有多少种不同的x1,x2,x3,x4,x5序列使得等式成立   a,x取值在-50到50之间 直接暴力的话肯定会超时的   100的五次方  10e了都    然后可以考虑将等式变一下形   把a1*x1^3+a2*x2^3移到右边   也就是-(a1*x1^3+a2^x2^3)=a3*x3^3+a4*x4^3+a5*x5^3 考虑到a1*x1^3+a2^x2^3的最大值50*50^3+50*50^3=12500000  这个数并不大  可以开这么大

POJ 1200 字符串HASH

题目链接:http://poj.org/problem?id=1200 题意:给定一个字符串,字符串只有NC个不同的字符,问这个字符串所有长度为N的子串有多少个不相同. 思路:字符串HASH,因为只有NC个不同的字符,所以我们可以把字符串看成是一个NC进制的串,然后计算出字符串的前缀HASH.然后枚举起点判断子串的HASH值是否已经存在.因为有了前缀HASH值,所以转移是O(1)的. #define _CRT_SECURE_NO_DEPRECATE #include<iostream> #in

使用GetHashes获取Windows的用户密码Hash值

GetHashes是InsidePro公司早期的一款Hash密码获取软件.在Win7上试了一下,它已经没办法捉到SAM文件的Hash值了,不过在Windows XP和Windows Server 2003上,这个小工具还是很好用的. GetHashes是一个命令行工具,它的命令格式是:GetHashes [System key file]或者GetHashes $Local(不区分大小写). 下面用Windows XP来演示一下GetHashes的用法. 我将GetHashes程序解压到了D盘的

IPVS基于应用层任意偏移字段HASH值的负载均衡算法

在比较早的那些年,我曾经写了一个负载均衡调度算法模块,是基于应用层协议包任意偏移量开始的一段固定长度的数据计算一个值,然后将这个值hash到不同的服务器.那时觉得没啥用,就没有再继续,直到前一段时间的一段思考以及前几天的一次预研.我决定作文以记之,以后说不定能用得着. 1.UDP服务的负载均衡 以前使用UDP的服务很少,虽然HTTP并没有说一定要是TCP,但事实上几乎没有UDP上的HTTP.但是随着网络可靠性的增加,网络集中控制机制与分布式优化技术的日益成熟,使用UDP的场合越来越多.     

IOS9.0中hash值的bug与解决方案

事件起因 事情是这样的:产品上线发布,突然出现了问题.运营Gg过来反应,当场给露珠演示,运营同事的手机是iphone,bug确实是存在的.奇怪的是露珠用了其他iphone手机(借别人的,露珠的是吊死安卓机),却没有发现这个问题.仔细询问,同事说他最近刚刚升级的ios9,于是问题最初定位在操作系统上.接下来检查代码,发现运行正常,逻辑也没错.问题就卡到这里了.没办法,线上问题,fiddler替换本地脚本调试,一级一级alert,从项目文件到底层库,最后定位到了backbone.查看backbone

WebQQ hash值获取 C#方法 2014/06/20

去年心血来潮,利用闲暇时间做了一个WebQQ的桌面软件,基本功能实现之后,就放那儿了.webQQ的协议时常更新,导致有些参数加密的方法要跟着更新,今天群里一朋友提供了一份最新的WebQQ hash的js,我转成了C#的方法,记在这里,希望对正在做webqq的朋友有所帮助. js方法 p=getqqhsahs(b,j) { for (var a = j + "password error", i = "", E = [];;) if (i.length <= a

域hash值破解的总结经验

1.vsssown.vbs拷贝域数据库: 1.1上传vssown.vbs文件 上传cscript.exe和vssown.vbs到域服务器上 1.2创建快照 reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters //得到ntds的默认路径:c:\ Windows\NTDS\ntds.dit cd 桌面 cscript //nologo vssown.vbs /start //启用 cscript