POJ2549【hash分离链接法】

题意:
给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
",res);
        else
            puts("no solution");
    }
    return 0;
}




原文地址:https://www.cnblogs.com/keyboarder-zsq/p/6777394.html