这是做过的几乎唯一的能用hash的题
记得当初写这个hash 貌似写出死循环了。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=4005;
const int key=1357;
const int Max =1000000000;
const int size=20345677;
int a[maxn],b[maxn],c[maxn],d[maxn];
int hash[size];
int sum[size];
void Insert(int num)
{
int t=num;
num=num%size;
while(hash[num]!=Max&&hash[num]!=t)
num=(num+key)%size;
hash[num]=t;
sum[num]++;
}
int Find(int num)
{
int t=num;
num=num%size;
while(hash[num]!=Max && hash[num]!=t)
num=(num+key)%size;
if(hash[num]==Max) return 0;
else return sum[num];
}
int main()
{
int i,j,n,ans;
while(~scanf("%d",&n))
{
ans=0;
for(i=0; i<n; ++i)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
for(i=0; i<size; ++i)
{
hash[i]=Max;
sum[i]=0;
}
for(i=0; i<n; ++i)
for(j=0; j<n; ++j)
Insert(a[i]+b[j]);
for(i=0; i<n; ++i)
for(j=0; j<n; ++j)
ans+=Find(-(c[i]+d[j]));
printf("%d\n",ans);
}
return 0;
}
#include <iostream>
#include<stdio.h>
using namespace std;
const int size=20345677;
const int M=1000000000;
const int key=1357;
int hash[size];
int mark[size];
void in(int n)
{
int t=n;
n=(n+M)%size;
while(hash[n]!=M&&hash[n]!=t)
{
n=(n+key)%size;
}
hash[n]=t;
mark[n]++;
}
int find(int n)
{
int t=n;
n=(n+M)%size;
while(hash[n]!=M&&hash[n]!=t)
{
n=(n+key)%size;
}
if(hash[n]==M) return 0;
else return mark[n];
}
int main()
{
int n;
int i,j;
int a[4005],b[4005],c[4005],d[4005];
scanf("%d",&n);
int z=0;
for(i=0; i<n; i++)
{
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
}
for(i=0; i<size; i++)
{
hash[i]=M;
mark[0]=0;
}
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
in(a[i]+b[j]);
}
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
z+=find(-(c[i]+d[j]));
}
printf("%d\n",z);
return 0;
}