您的位置:首页 > 其它

poj 2503 hash

2015-10-24 13:19 369 查看
一道练模板的题

用stl就可以直接过,1500+ms

自己写hash搜索,300+ms

#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 =10007;
const int key = 177;

int hashn[maxnum];
struct node
{
unsigned long long val;
int next;
char dic[11];
}table[100001];
int p;
void init(){
FOR(i,1,maxnum-1)hashn[i]=-1;
p=0;
}

void inserthash(unsigned long long tag,char end[11]){
int num = tag%maxnum;
table[p].next=hashn[num];
table[p].val = tag;
strcpy(table[p].dic,end);
hashn[num]=p++;
}

int findhash(unsigned long long tag){
int num = tag%maxnum;
for(int i =hashn[num];i!=-1;i=table[i].next){
if(table[i].val==tag)
return i;
}
return -1;
}

int main()
{
/*fstream fin("G:/1.txt");*/
init();
while(1){//dic
char tmp[11],fore[11];
tmp[0]=getchar();
if(tmp[0]=='\n')break;
FOR(i,1,10){
tmp[i]=getchar();
if(tmp[i]==' '){
tmp[i]='\0';
break;
}
}
scanf("%s",fore);
getchar();
int len = strlen(fore);
unsigned long long tag=0;
FOR(i,0,len-1){
tag = tag*26+fore[i]-'a';
}
inserthash(tag,tmp);

}
char tmp[11];
while(scanf("%s",tmp)!=EOF){
int len = strlen(tmp);
unsigned long long tag=0;
FOR(i,0,len-1){
tag = tag*26+tmp[i]-'a';
}
int num = findhash(tag);
if(num!=-1)
printf("%s\n",table[num].dic);
else
printf("eh\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj hash