HDU1880 魔咒词典

Posted swiftac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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())!=
)
            cnt++;
        t[cnt]=;
        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())!=
)
            cnt++;
        s[cnt]=;
        x=hash1(s);
        y=hash2(s);
        if(s[0]==[){
            if(dict.find(make_pair(x,y))==dict.end()) printf("what?
");
            else cout<<dict[make_pair(x,y)]<<endl;
        }
        else{
            if(dict.find(make_pair(x,y))==dict.end()) printf("what?
");
            else cout<<dict[make_pair(x,y)].substr(1,dict[make_pair(x,y)].length()-2)<<endl;
        }
    }
}
int main(){
    read();
    
    solve();
   
    return 0;
}

以上是关于HDU1880 魔咒词典的主要内容,如果未能解决你的问题,请参考以下文章

HDU1880 魔咒词典文本处理

HDU 1880 魔咒词典 (Hash)

HDU 1880 简单Hash

Hash

魔咒词典

1029.魔咒词典