标签:hash
题意:给定字符串以及对应的字符串,再给字符串找到对应的字符串,不存在输出"eh"。
思路:造模板。
/********************************************************* file name: poj2503.cpp author : kereo create time: 2015年04月12日 星期日 17时13分12秒 *********************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<set> #include<map> #include<vector> #include<stack> #include<cmath> #include<string> #include<algorithm> using namespace std; typedef long long ll; typedef unsigned long long ull; const int sigma_size=26; const int N=15; const int MAXN=100000+50; const int HASH=100007; const int inf=0x3fffffff; const double eps=1e-8; const int mod=1000000000+7; #define L(x) (x<<1) #define R(x) (x<<1|1) #define PII pair<int, int> #define mk(x,y) make_pair((x),(y)) int edge_cnt; int head[MAXN]; char str[N<<1],str1[N],str2[N]; struct node{ int next; char str1[N],str2[N]; //str1为key,str2为val }edge[MAXN]; struct Hash{ void init(){ edge_cnt=0; memset(head,-1,sizeof(head)); } ull BKDRhash(char *str){ ull seed=31,tmp=0; int len=strlen(str); for(int i=0;i<len;i++){ tmp=tmp*seed+(str[i]-'a')+1; } return tmp; } void insert(char *str1,char *str2){ int u=BKDRhash(str2)%HASH; for(int i=head[u];i!=-1;i=edge[i].next){ if(strcmp(edge[i].str1,str2) == 0) return ; } strcpy(edge[edge_cnt].str1,str2); strcpy(edge[edge_cnt].str2,str1); edge[edge_cnt].next=head[u]; head[u]=edge_cnt++; } void solve(char *str){ int u=BKDRhash(str)%HASH; for(int i=head[u];i!=-1;i=edge[i].next){ if(strcmp(str,edge[i].str1) == 0){ printf("%s\n",edge[i].str2); return ; } } printf("eh\n"); } }hash; int main(){ //freopen("in.txt","r",stdin); hash.init(); int c; while((c=getchar())!=EOF){ int len1=0,len2=0; if(c<'a' || c>'z') break; str1[len1++]=c; while((c=getchar())!=EOF && c>='a' && c<='z') str1[len1++]=c; while((c=getchar())!=EOF && c>='a' && c<='z') str2[len2++]=c; hash.insert(str1,str2); } while(~scanf("%s",str)){ hash.solve(str); } return 0; }
poj2503 Babelfish BKDRhash+链式hash
标签:hash
原文地址:http://blog.csdn.net/u011645923/article/details/45013565