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;
    }
  • 相关阅读:
    ABAP 没有地方输入H 进入DEBUG 怎么办?
    Jsoup实现java模拟登陆
    Jsoup模拟登陆例子
    Jsoup:解决java.net.UnknownHostException的问题
    Java抓取网页数据(原网页+Javascript返回数据)
    利用StringEscapeUtils对字符串进行各种转义与反转义(Java)
    MyEclipse + Tomcat 热部署问题
    管道寄售库存MRKO结算后,冲销问题
    c#操作appsettiongs
    让你的微信小程序具有在线支付功能
  • 原文地址:https://www.cnblogs.com/GadyPu/p/4783992.html
Copyright © 2011-2022 走看看