poj 2503 hash

一道练模板的题

用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");
	}
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值