首页 > 学院 > 开发设计 > 正文

POJ2549【hash分离链接法】

2019-11-06 08:52:09
字体:
来源:转载
供稿:网友
题意:给n个不同的数,求一个4个数(a,b,c,d)的组合满足a+b+c=d;求最大的d。思路:没想到可以用hash搞/这个就是数据结构里的分离链接法~解决hash冲突的方法:将所有关键字为同义词的结点链接在同一单链表中。a+b+c=d转化成a+b=d-c;先将所有的a+b hash掉。然后用 d-c 去找。

复杂度n^2*HASH;

#include<cstdio>#include<string.h>#include<algorithm>using namespace std;const int mod=5e5+10;const int N=5e5+10;struct Node{    int x,y;};Node q[N];int Ha[mod],nex[mod],s[1010],res,n;bool flag;void solve(int x,int y){    int key=(x-y+mod)%mod;    int i=Ha[key];    while(i!=-1)    {        while((q[i].x+q[i].y)==(x-y)&&q[i].x!=x&&q[i].x!=y&&q[i].y!=y&&q[i].y!=x)        {            res=x;            flag=true;            return;        }        i=nex[i];    }}int main(){    while(scanf("%d",&n)&&n)    {        for(int i=0;i<n;i++) scanf("%d",&s[i]);        int tot=0;        sort(s,s+n);        memset(Ha,-1,sizeof(Ha));        for(int i=0;i<n-1;i++)            for(int j=i+1;j<n;j++)            {                q[tot].x=s[j];q[tot].y=s[i];                int key=(s[i]+s[j]+mod)%mod;                nex[tot]=Ha[key];                Ha[key]=tot;                tot++;            }        res=-1000000000;        flag=false;        for(int i=n-1;i>=1;i--)            for(int j=i-1;j>=0;j--)            {                if(flag) break;                solve(s[i],s[j]);            }        if(res!=-1000000000)            PRintf("%d/n",res);        else            puts("no solution");    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表