哈希 poj 2002

n个点

求其中有几个正方形

n<1000

暴力4个点就不行了

大概2个点还可以

根基(x*x+y*y)%素数 hash 一下

告诉你2个点求 另外2个点 画个图推一下

重复要/2;

 #include<stdio.h>
#include<algorithm>
#include<vector> using namespace std; #define mod 10007
struct point
{
int x,y; }x[]; vector<point>hash[mod]; void insert(int a)
{
int h=(x[a].x*x[a].x+x[a].y*x[a].y)%mod;
hash[h].push_back(x[a]);
}
bool cmp(point a,point b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
bool search(int a,int b)
{
int h=(a*a+b*b)%mod;
for(int i=;i<hash[h].size();i++)
{
if(hash[h][i].x==a&&hash[h][i].y==b)
return true;
}
return false;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
for(int i=;i<mod;i++)
hash[i].clear(); for(int i=;i<=n;i++)
{
scanf("%d%d",&x[i].x,&x[i].y);
insert(i);
}
int cnt=;
sort(x+,x+n+,cmp);
for(int i=;i<=n;i++)
{
for(int j=i+;j<=n;j++)
{
int x1,y1,x2,y2;
x1=x[i].x-(x[j].y-x[i].y);
y1=x[i].y+(x[j].x-x[i].x);
x2=x[j].x-(x[j].y-x[i].y);
y2=x[j].y+(x[j].x-x[i].x);
if(search(x1,y1)&&search(x2,y2))
cnt++; }
}
printf("%d\n",cnt/);
} return ;
}
上一篇:Apache Lucene(全文检索引擎)—搜索


下一篇:int 转换成 CString(VC2008里有这个问题)