码迷,mamicode.com
首页 > 其他好文 > 详细

HDU1880 魔咒词典

时间:2020-01-05 19:03:09      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:unsigned   映射   span   def   air   scan   ons   iostream   入门   

题目大意:对应的输入多行,每行两个字符串,两个字符串互相映射。接下来询问的时候,如果这个字符串出现过,输出其对应的字符串。

分析:二重哈希来判断字符串是否存在,输出其对应的字符串就行。二重哈希的入门题,字符串还挺有意思的。

代码:

#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;
}

HDU1880 魔咒词典

标签:unsigned   映射   span   def   air   scan   ons   iostream   入门   

原文地址:https://www.cnblogs.com/SwiftAC/p/12153073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!