POJ2503 Babelfish(hash)

10W 的字符串查询,据说 二分,map,sort 各种过,没有尝试,写的hash,自己的hash函数 TLE 了,搜了个 UNIX 用的处理字符函数……

真心弱爆了,一直以来,指针都没有理解透彻,真心渣渣……


Code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define Mod 39917
#define N 12
#define M 100001

struct Word{
	char name[N],shit[N];
}list[M];

struct Node{
	char * name,* shit;
	Node * next;
}word[Mod+10];

int ELFHash(char *key)// UNIX 系统ELF字符串散列函数,对字符串的处理一般使用此函数
{
	unsigned long h=0;
	while (*key){
		h=(h<<4)+*key++;
		unsigned long g=h & 0xf0000000L;
		if (g) h^=g>>24;
		h &= ~g;
	}return h%Mod;
}

void insert(char *s1,char *s2){  
    int key=ELFHash(s2);
	Node *newNode = new Node;  
    newNode->name=s1;
	newNode->shit=s2;
	newNode->next = word[key].next;
	word[key].next = newNode; 
}  

void search(char *s){  
    int key=ELFHash(s);
	Node *jobs = new Node;
	jobs = word[key].next;
	while(jobs != NULL){    
        if( strcmp(jobs->shit,s)==0 ){
			printf("%s\n",jobs->name);return;
		}
		jobs = jobs->next;
    }
	printf("eh\n");
	return;
}

int main()
{
	int i=0;
	char str[N],*tmp1,*tmp2,*fuck;
	//指针 保存地址,指向一块内存,也就是说,它不能直接保存数据,如果想用指针标示
	//一个数据的话,需要先给这个数据申请内存空间,然后用这个指针指向那块内存
	while( gets(str) && str[0]!=0 ){
		//好吧,我承认,我2B了,gets()是可以读入'\n'的,也就是说,空行的str长度是1,不是0
		//我用 while(gets(str) && strlen(str)>0) 开开心心的WA到凌晨四点……
		sscanf(str,"%s%s",&list[i].name,&list[i].shit);
		tmp1=list[i].name; tmp2=list[i].shit;
		insert(tmp1,tmp2);
		i++;
	}
	while(gets(str)){
		fuck=str;
		search(fuck);
	}
	return 0;
}


你可能感兴趣的:(list,struct,unix,search,insert,jobs)