HASH是一种极其有益的算法,俗称标记法,主要用途是从大量数据中找到某一些问题的答案。
和线段树差不多,不过线段树是搜寻相对应的量,而HASH则是一个单独的量。
比较有难度,而字符串HASH则是提高+的内容了,如果大家有兴趣的话,可以认真学习。
接下来是我编写的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ull unsigned long long
const ull p = 1e8+7;
const int mod=100003;
int e,to[mod],next[mod],begin[mod];
char a[mod][12],b[mod][12];
int hashx(char *s){
int len=strlen(s);
ull hs=0;
for(int i=0;i<len;i++)
hs=hs*p+s[i];
return hs%mod+1;
}
void insert(int i,char *s){
int x=hashx(s);
to[++e]=i;
next[e]=begin[x];
begin[x]=e;
}
char *find(char *s){
int x=hashx(s);
for(int i=begin[x];i;i=next[i])
if(strcmp(b[to[i]],s)==0)
return a[to[i]];
return NULL;
}
int main(){
char s[15],s1[15],s2[15];
int i=0;
while(1){
gets(s);
if(s[0] == '\0')
break;
++i;
sscanf(s,"%s %s", a[i], b[i]);
insert(i,b[i]);
}
while(gets(s)!=NULL){
if(s[0]=='\0')break;
char *st=find(s);
if(st!=0)
puts(st);
else
puts("eh");
}
return 0;
}