HDU1880 魔咒词典
题目大意:对应的输入多行,每行两个字符串,两个字符串互相映射。接下来询问的时候,如果这个字符串出现过,输出其对应的字符串。
分析:二重哈希来判断字符串是否存在,输出其对应的字符串就行。二重哈希的入门题,字符串还挺有意思的。
代码:
#include<iostream> #include<string> #include<map> #include<string> using namespace std; typedef unsigned long long ull; map<pair<int,int>,string> dict; const int s1=133,s2=233; const int maxn=1e5+7; char s[1000],t[1000]; int hash1(char* s){ int ans=0; for(int i=0;s[i];i++) ans=(ans*s1+s[i])%maxn; return ans; } int hash2(char* s){ int ans=0; for(int i=0;s[i];i++) ans=(ans*s2+s[i])%maxn; return ans; } void read(){ int cnt=0; while(scanf("%s",s)&&s[0]!='@'){ getchar(); cnt=0; while((t[cnt]=getchar())!='\n') cnt++; t[cnt]='\0'; dict[make_pair(hash1(s),hash2(s))]=t; dict[make_pair(hash1(t),hash2(t))]=s; } } void solve(){ int m,x,y,cnt=0; scanf("%d",&m); getchar(); while(m--){ cnt=0; while((s[cnt]=getchar())!='\n') cnt++; s[cnt]='\0'; x=hash1(s); y=hash2(s); if(s[0]=='['){ if(dict.find(make_pair(x,y))==dict.end()) printf("what?\n"); else cout<<dict[make_pair(x,y)]<<endl; } else{ if(dict.find(make_pair(x,y))==dict.end()) printf("what?\n"); else cout<<dict[make_pair(x,y)].substr(1,dict[make_pair(x,y)].length()-2)<<endl; } } } int main(){ read(); solve(); return 0; }