HDU 1880 简单Hash

题目链接:【http://acm.hdu.edu.cn/showproblem.php?pid=1880】

中文题面,题意很简单;

题解: 把每个 魔咒 和 对应的功能分别Hash,然后分别映射到map<ULL,string>里面,(魔咒Hash值,对应的功能)和(对应功能Hash值,魔咒)。

Hash 方式采用最简单的那种Hash即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100 + 15;
const int sed = 131;
typedef unsigned long long ULL;
unordered_map<ULL, string>mpa, mpb;
char tmp[maxn], sa[maxn], sb[maxn];
ULL get_Hash(char s[], int len)
{
    ULL ret = 0;
    for(int i = 0; i < len; i++)
    {
        ret = ret * sed + s[i];
    }
    return ret;
}
int main ()
{
    while(true)
    {
        gets(tmp);
        int len = strlen(tmp);
        if(!strcmp("@[email protected]", tmp)) break;
        int cnt = 0, pos = 0;
        for(int i = 1; i < len; i++)
        {
            if(tmp[i] == ‘]‘)
            {
                pos = i + 2;
                break;
            }
            sa[cnt++] = tmp[i];
        }
        sa[cnt] = 0;
        ULL ta = get_Hash(sa, cnt);
        cnt = 0;
        for(int i = pos; i < len; i++)
            sb[cnt++] = tmp[i];
        sb[cnt] = 0;
        ULL tb = get_Hash(sb, cnt);
        mpa[ta] = (string)(sb);
        mpb[tb] = (string)(sa);
    }
    int N;
    scanf("%d", &N);
    gets(tmp);
    for(int i = 1; i <= N; i++)
    {
        gets(tmp);
        int len = strlen(tmp);
        if(tmp[0] == ‘[‘)
        {
            for(int i = 0; i < len; i++)
                tmp[i] = tmp[i + 1];
            tmp[len - 2] = 0;
            ULL T = get_Hash(tmp, len - 2);
            if(mpa.count(T))
                cout << mpa[T] << endl;
            else
                cout << "what?" << endl;
            continue;
        }
        ULL T = get_Hash(tmp, len);
        if(mpb.count(T))
            cout << mpb[T] << endl;
        else
            cout << "what?" << endl;
    }
    return 0;
}

  

时间: 2024-11-03 16:30:49

HDU 1880 简单Hash的相关文章

hdu 1880 字符串hash

/*普通的hsah 由于元素太多 空间很小..hash碰撞很厉害.30分*/ #include<iostream> #include<cstdio> #include<cstring> #include<map> #define maxn 100010 #define mod 2000007 #define hs 117 using namespace std; int n,l,k,cnt,f[mod+10],l1[maxn],l2[maxn]; char

hdu 1880 魔咒词典(字符串hash)

题目链接:hdu 1880 魔咒词典 题意: 给你一个10w的词典,让你输出对应的字段. 题解: map暴力存字符串肯定会卡内存,这里用BKDR字符串hash一下,用map映射一下. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef unsigned long long ull; 5 6 const int N=1e5+7,seed=133

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

hdu 1087 简单dp

思路和2391一样的.. <span style="font-size:24px;">#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int inf=(0x7f7f7f7f); int main() { int a; int s[10005]; int w[10005];

HDU 4891 简单模拟

The Great Pan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1035    Accepted Submission(s): 355 Problem Description As a programming contest addict, Waybl is always happy to take part in vario

HDOJ-ACM1425 sort 简单hash应用

其实快排也可以通过这个问题~不是考点 没想到考点是这个,简单hash应用,空间换时间 初始化一个长度为1000001的数组(由于数字的范围为[-500000,500000]) 如果存在这个数m,数组下标为m的加一 数组从1000000倒计,值为1的输出 很无奈~直接贴别人代码 #include<iostream> int hash[1000001]; int main(){ int n,m,temp,cnt; while(scanf("%d%d",&n,&m

HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很基础的一道题 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm

HDU 4826 简单DP

Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向右走以前没有走过的格子,每一个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币可以为负,需要给强盗写欠条),度度熊刚开始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币? Input 输入的第一行是一个整数T(T < 200),表示共有T组数据.每组数据的

HDU Tickets(简单的dp递推)

Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 972    Accepted Submission(s): 495 Problem Description Jesus, what a great movie! Thousands of people are rushing to the cinema. However,