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;
}
posted @ 2020-01-05 17:42  SwiftAC  阅读(118)  评论(0编辑  收藏  举报