poj 2503 简单哈希
题意:
输入一个字典,然后查询字典,翻译单词。
分析:
这题以前做过,是Trie树的入门题,当时也用map水过,现在用hash再水一遍。。。
比较好的输入处理:
sscanf
(str,
"%s %s"
,str1,str2);
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; const int prime=14997; typedef long long ll; typedef pair<int,int>pii; struct st { int len; char a[2][11]; }; vector<st>hs[prime]; void getHash(char* s,int len) { ll t=0,k=10000000000; for(int i=0;i<len;i++)t+=k*(s[i]-'a'),k>>=1; int id=t%prime,j; for(int i=0;i<hs[id].size();i++){ st& b=hs[id][i]; if(b.len==len) for(j=0;j<len;j++)if(s[j]!=b.a[1][j])break; if(j==len){ printf("%s\n",b.a[0]);return; } } printf("eh\n"); } int main() { //freopen("f.txt","r",stdin); int i; char s[22]; st p; while(gets(s)){ int len=strlen(s); if(len==0)break; for(i=0;s[i]!=' ';i++)p.a[0][i]=s[i]; ll t=0,k=10000000000;p.a[0][i++]='\0'; p.len=len-i; int m=0; for(;i<len;i++)p.a[1][m++]=s[i],t+=k*(s[i]-'a'),k>>=1; //构造key值 hs[t%prime].push_back(p); } while(~scanf("%s",s)){ getHash(s,strlen(s)); } return 0; }