poj 2002 hash
2015-10-24 20:10
211 查看
找到两个点,算出组成正方形的另外两个点,如果都存在就true;
一直都是用这个n进制哈希方法,因为第一次遇见被它惊呆了。
1032ms
#include<iostream>
#include<map>
#include <string>
#include<algorithm>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =20007;
const int key = 177;
int n;
int bp[20007];
struct NODE
{
int val,next;
}node[3000];
int p;
void init(){
FOR(i,0,maxnum-1) bp[i]=-1;
p=0;
}
struct proxy
{
int x,y;
}point[1005];
void inserthash(int x,int y){
int sum1 = x*maxnum+y;
int sum=abs(sum1%maxnum);
node[p].next=bp[sum];
node[p].val = sum1;
bp[sum]=p++;
}
bool checkproxy(int x,int y){
int sum1 = x*maxnum+y;
int sum=abs(sum1%maxnum);
for(int i=bp[sum];i!=-1;i=node[i].next){
if(sum1==node[i].val) return true;
}
return false;
}
int main()
{ /*
fstream fin("G:/1.txt");
while(fin>>n){*/
while(scanf("%d",&n),n){
init();
int sum=0;
FOR(i,1,n){
scanf("%d%d",&point[i].x,&point[i].y);/*
fin>>point[i].x>>point[i].y;*/
inserthash(point[i].x,point[i].y);
}
FOR(i,1,n){
FOR(j,i+1,n){
int a=point[j].x-point[i].x;
int b=point[j].y-point[i].y;
sum+=checkproxy(point[j].x+b,point[j].y-a)&&checkproxy(point[i].x+b,point[i].y-a);
sum+=checkproxy(point[j].x-b,point[j].y+a)&&checkproxy(point[i].x-b,point[i].y+a);
}
}
printf("%d\n",sum/4);
}
}
一直都是用这个n进制哈希方法,因为第一次遇见被它惊呆了。
1032ms
#include<iostream>
#include<map>
#include <string>
#include<algorithm>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define FORE(i,b,e) for(int i=b;i>=e;i--)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum =20007;
const int key = 177;
int n;
int bp[20007];
struct NODE
{
int val,next;
}node[3000];
int p;
void init(){
FOR(i,0,maxnum-1) bp[i]=-1;
p=0;
}
struct proxy
{
int x,y;
}point[1005];
void inserthash(int x,int y){
int sum1 = x*maxnum+y;
int sum=abs(sum1%maxnum);
node[p].next=bp[sum];
node[p].val = sum1;
bp[sum]=p++;
}
bool checkproxy(int x,int y){
int sum1 = x*maxnum+y;
int sum=abs(sum1%maxnum);
for(int i=bp[sum];i!=-1;i=node[i].next){
if(sum1==node[i].val) return true;
}
return false;
}
int main()
{ /*
fstream fin("G:/1.txt");
while(fin>>n){*/
while(scanf("%d",&n),n){
init();
int sum=0;
FOR(i,1,n){
scanf("%d%d",&point[i].x,&point[i].y);/*
fin>>point[i].x>>point[i].y;*/
inserthash(point[i].x,point[i].y);
}
FOR(i,1,n){
FOR(j,i+1,n){
int a=point[j].x-point[i].x;
int b=point[j].y-point[i].y;
sum+=checkproxy(point[j].x+b,point[j].y-a)&&checkproxy(point[i].x+b,point[i].y-a);
sum+=checkproxy(point[j].x-b,point[j].y+a)&&checkproxy(point[i].x-b,point[i].y+a);
}
}
printf("%d\n",sum/4);
}
}
相关文章推荐
- c语言实现hashmap(转载)
- Ruby中Hash的11个问题解答
- Ruby简明教程之数组和Hash介绍
- 在C#中生成与PHP一样的MD5 Hash Code的方法
- js中hash和ico的关联分析
- Javascript SHA-1:Secure Hash Algorithm
- 理解php Hash函数,增强密码安全
- PHP利用hash冲突漏洞进行DDoS攻击的方法分析
- PowerShell中定义哈希散列(Hash)和调用例子
- Redis String 类型和 Hash 类型学习笔记与总结
- php操作redis中的hash和zset类型数据的方法和代码例子
- Perl 哈希Hash用法之入门教程
- perl哈希hash的常见用法介绍
- php自定义hash函数实例
- php对文件进行hash运算的方法
- php常用hash加密函数
- PHP Hash算法:Times33算法代码实例
- php的hash算法介绍
- memcache一致性hash的php实现方法
- Mysql中的Btree与Hash索引比较