刚刚学习hash,做了两道题,挺有体会的。还在摸索中,代码写的很乱……
http://acm.pku.edu.cn/JudgeOnline/problem?id=2549
//首先枚举a+b,建立hashtable,(注意a+b小于0时的取址问题),
//然后枚举d-c,同样注意取址,在hashtable中查找地址相同的,
//并比较是否是所查的结果.记录当前最大的d值
//注意,i,j,k,l不能重复……
#include<iostream>
#include<cmath>
using namespace std;
int n;
struct q
{ long val;
int x1,x2;
}hash[1000001];
int prime=999983;
long num[10001];
long sum,cha;
int i,j;
void build(long t)
{ if(hash[t].val==0)
{ hash[t].val=sum;
hash[t].x1=i;
hash[t].x2=j;
}
else
{ if(hash[t].val!=0&&hash[t].val!=sum)
build(t+1);
}
}
bool find(long t)
{ if(hash[t].val==0)
return 0;
else if(hash[t].val==cha&&hash[t].x1!=i&&hash[t].x2!=i&&hash[t].x1!=j&&hash[t].x2!=j)
return 1;
else if(hash[t].val!=0&&hash[t].val!=cha)
{ find(t+1);
}
else return 0;
}
int main()
{ while(scanf("%d",&n)&&n)
{ memset(hash,0,sizeof(hash));
memset(num,0,sizeof(num));
long k;
long temp;
for(i=0;i<n;i++)
{ scanf("%ld",&num[i]);
}
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
{ if(i==j)
continue;
sum=num[i]+num[j];
if(sum<0)
temp=(-1)*sum;
else temp=sum;
build(temp%prime);
}
}//build hashtable[]=a+b;
long best=-536870913;
for(i=0;i<n;i++)
{ for(j=0;j<n;j++)
{ if(i==j)
continue;
cha=num[i]-num[j];
if(cha<0)
temp=(-1)*cha;
else temp=cha;
if(find(temp%prime)&&num[i]>best)
best=num[i];
}
}//穷举hash[x]=d-c==a+b
if(best==-536870913)
printf("no solution\n");
else
printf("%ld\n",best);
}
system("pause");
return 0;
}