zoukankan      html  css  js  c++  java
  • hdu 1880 魔咒词典

    题目连接

    http://acm.hdu.edu.cn/showproblem.php?pid=1880  

    魔咒词典

    Description

    哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。

    给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”

    Input

    首先列出词典中不超过100000条不同的魔咒词条,每条格式为:

    [魔咒] 对应功能

    其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
    词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。

    Output

    每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”

    Sample Input

    [expelliarmus] the disarming charm
    [rictusempra] send a jet of silver light to hit the enemy
    [tarantallegra] control the movement of one's legs
    [serpensortia] shoot a snake out of the end of one's wand
    [lumos] light the wand
    [obliviate] the memory charm
    [expecto patronum] send a Patronus to the dementors
    [accio] the summoning charm
    @END@
    4
    [lumos]
    the summoning charm
    [arha]
    take me to the sky

    Sample Output

    light the wand
    accio
    what?
    what?

    开始用的mp, mle了然后写了个哈希太挫了 掩面(*/ω╲*)。。

    #include<algorithm>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<vector>
    #include<map>
    using std::abs;
    using std::sort;
    using std::pair;
    using std::swap;
    using std::vector;
    using std::multimap;
    #define pb(e) push_back(e)
    #define sz(c) (int)(c).size()
    #define mp(a, b) make_pair(a, b)
    #define all(c) (c).begin(), (c).end()
    #define iter(c) decltype((c).begin())
    #define cls(arr, val) memset(arr, val, sizeof(arr))
    #define cpresent(c, e) (find(all(c), (e)) != (c).end())
    #define rep(i, n) for(int i = 0; i < (int)n; i++)
    #define tr(c, i) for(iter(c) i = (c).begin(); i != (c).end(); ++i)
    const int N = 100077;
    const int INF = 0x3f3f3f3f;
    typedef unsigned long long ull;
    struct Hash_Set {
        struct edge { char str1[22], str2[82]; int next; }G_1[N], G_2[N];
        int tot_1, tot_2, head_1[N], head_2[N];
        inline void init() {
            tot_1 = 0, cls(head_1, -1);
            tot_2 = 0, cls(head_2, -1);
        }
        inline int hash_func(char *s) {
            int val = 0;
            while (*s != '') {
                val = ((val << 1) + (*s - 'a')) % N;
                s++;
            }
            return val;
        }
        inline void insert_1(char *p, char *p1) {
            char *s = p;
            int val = hash_func(p);
            int u = abs(val) % N;
            strcpy(G_1[tot_1].str1, p); strcpy(G_1[tot_1].str2, p1);
            G_1[tot_1].next = head_1[u], head_1[u] = tot_1++;
        }
        inline void insert_2(char *p, char *p1) {
            char *s = p;
            int val = hash_func(p);
            int u = abs(val) % N;
            strcpy(G_2[tot_2].str2, p); strcpy(G_2[tot_2].str1, p1);
            G_2[tot_2].next = head_2[u], head_2[u] = tot_2++;
        }
        inline char *find_1(char *p) {
            char *s = p;
            int val = hash_func(p);
            int u = abs(val) % N;
            for (int i = head_1[u]; ~i; i = G_1[i].next) {
                if (!strcmp(G_1[i].str1, p)) return G_1[i].str2;
            }
            return NULL;
        }
        inline char *find_2(char *p) {
            char *s = p;
            int val = hash_func(p);
            int u = abs(val) % N;
            for (int i = head_2[u]; ~i; i = G_2[i].next) {
                if (!strcmp(G_2[i].str2, p)) return G_2[i].str1;
            }
            return NULL;
        }
    }hash;
    int main() {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w+", stdout);
    #endif
        char *p;
        int n, k;
        char buf[200], str1[100], str2[100];
        hash.init();
        while (gets(buf)) {
            if (!strcmp(buf, "@END@")) break;
            cls(str2, 0);
            p = strchr(buf, ']');
            k = p - buf;
            strncpy(str1, buf + 1, k - 1), str1[k - 1] = '';
            strcpy(str2, p + 2);
            hash.insert_1(str1, str2), hash.insert_2(str2, str1);
        }
        scanf("%d", &n);
        getchar();
        while (n--) {
            gets(buf);
            if (buf[0] == '[') {
                p = strchr(buf, ']');
                k = p - buf;
                strncpy(str1, buf + 1, k - 1), str1[k - 1] = '';
                p = hash.find_1(str1);
                puts(!p ? "what?" : p);
            } else {
                p = hash.find_2(buf);
                puts(!p ? "what?" : p);
            }
        }
        return 0;
    }
  • 相关阅读:
    Notes of Daily Scrum Meeting(12.18)
    Notes of Daily Scrum Meeting(12.17)
    Notes of Daily Scrum Meeting(12.16)
    Notes of Daily Scrum Meeting(12.8)
    Notes of Daily Scrum Meeting(12.5)
    Notes of Daily Scrum Meeting(12.3)
    Notes of Daily Scrum Meeting(11.12)
    Linux中profile、bashrc、bash_profile之间的区别和联系
    Linux GCC编译
    mysql 5.7.16 远程连接
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4783992.html
Copyright © 2011-2022 走看看