魔咒词典

TimeLimit: 8000/5000 MS (Java/Others)  MemoryLimit: 32768/32768 K (Java/Others)
64-bit integer IO format:%I64d
Problem Description
哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。

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

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

[魔咒] 对应功能

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

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

SampleInput
[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

SampleOutput
light the wand
accio
what?
what?

题意:这题的话,就是通过前面的字符串查找后面的字符串,或者是通过后面的字符串查找前面的字符串。这里我用的字符串hash来写,由于这道题比较卡内存,因此在分配内存的时候选择的是手动分配内存,当然你可以提前分配好,但是尽量不要超太多,不然会被卡掉。处理hash冲突时,这里通过链表的方式处理hash的,跟链式前向星差不多,相信有学过这个就很容易理解这种写法。这里的ELFHhash函数可以参考这个博客https://blog.csdn.net/weixin_39002938/article/details/77855824,这里讲得算是蛮清楚的了。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5
  6
  7 using namespace std;
  8 const int maxn = 1e5 + 7;///范围
  9
 10 struct Hash_map
 11 {
 12
 13     static const int maxn = 2e5 + 7;///字符串的最大数量
 14     static const int MAXINT = 0x7FFFFFFF;
 15
 16     int first[maxn], sign;
 17
 18     struct Edge
 19     {
 20         int to, next;
 21         char *str, *ttr;
 22     } edge[maxn];
 23
 24     inline void init()
 25     {
 26         memset(first, -1, sizeof(first));
 27         sign = 0;
 28     }
 29
 30     inline int get_hash(char *str)
 31     {
 32         unsigned  long long h=0;
 33         while(*str)
 34         {
 35             h=(h<<4)+(*str++);
 36             long long g=h&0Xf0000000L;
 37             if(g)
 38                 h^=g>>24;
 39             h&=~g;
 40         }
 41         return h&MAXINT;
 42     }
 43
 44     inline void add_edge(int u, char *str, char *ttr)
 45     {
 46         int lens = strlen(str), lent = strlen(ttr);
 47         edge[sign].str = new char[lens + 1];
 48         edge[sign].ttr = new char[lent + 1];
 49         strcpy(edge[sign].str, str);
 50         strcpy(edge[sign].ttr, ttr);
 51         edge[sign].next = first[u];
 52         first[u] = sign ++;
 53     }
 54
 55     inline void Insert(char *str, char *ttr)
 56     {
 57         int key = get_hash(str) % (maxn);
 58         add_edge(key, str, ttr);
 59     }
 60
 61     inline bool Find(char *str)
 62     {
 63         int key = get_hash(str) % (maxn);
 64         for(int i = first[key]; ~i; i = edge[i].next)
 65         {
 66             if(!strcmp(str, edge[i].str))
 67             {
 68                 puts(edge[i].ttr);
 69                 return 1;
 70             }
 71         }
 72         puts("what?");
 73         return 0;
 74     }
 75 } T1;
 76
 77 char str[105], ttr[105], ktr[105];
 78 int n;
 79 int main()
 80 {
 81     T1.init();
 82
 83     while(scanf("%s",str)&&strcmp(str,"@END@")!=0)
 84     {
 85         int len=strlen(str);
 86         for(int i=0; i<len-1; i++)
 87             str[i]=str[i+1];
 88         str[len-2]='\0';
 89         getchar();
 90         gets(ttr);
 91         T1.Insert(str,ttr);
 92         T1.Insert(ttr,str);
 93
 94     }
 95     scanf("%d",&n);
 96     getchar();
 97     while(n--)
 98     {
 99         gets(ktr);
100         if(ktr[0]=='[')
101         {
102             int len=strlen(ktr);
103             for(int i=0; i<len-1; i++)
104                 ktr[i]=ktr[i+1];
105             ktr[len-2]='\0';
106
107         }
108         T1.Find(ktr);
109     }
110     return 0;
111
112
113 }

View Code

转载于:https://www.cnblogs.com/yuanlinghao/p/10439370.html

HDU-魔咒词典(字符串hash)相关推荐

  1. 字符串哈希(魔咒词典hdu1880)

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

  2. hdu 1880 魔咒词典

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. ccf练习-魔咒词典(字符串分割,<map>存储)

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

  4. 魔咒词典---哈希+二分

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

  5. HDU1880 魔咒词典【文本处理】

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  6. 魔咒词典(C/C++)

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

  7. 湖南大学21夏训练三3.魔咒词典

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

  8. C++映射——魔咒词典

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

  9. 『杭电1880』魔咒词典

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

  10. 杭电acm 1880魔咒词典(水题)

    魔咒词典 Time Limit: 8000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

最新文章

  1. 技术/领域专家有什么要求?
  2. 华为云AIOps实践全面解析
  3. VC++ 2010 MFC新特性学习 - 增强与Windows Shell的集成
  4. 拿着35W年薪,混的却不如实习生
  5. referer htttp headers 统计信息 防盗链
  6. Memory与Merge特性
  7. FTP服务器配置部分
  8. Centos6.8编译安装LNMP环境
  9. php中,多维数组是什么意思,在PHP中回显多维数组
  10. VMware虚拟机中的CentOS7安装Nginx后本机无法访问的解决办法
  11. STM32F103学习笔记(4)—— 串口通信——发送、接收数据详解
  12. Nmap端口扫描windows版
  13. 迪赛智慧数——折线图(渐变堆叠图):近十年母亲节消费趋势
  14. Android接收开机广播接收速度慢的原因
  15. 新产品如何推广?推广新产品的方法和技巧
  16. AT指令表(中文详解)
  17. 2020.5.12第一次博客
  18. 草根创业三大方向:移动互联网电子商务网游
  19. 计算机windows解压文件,Win10专业版怎么压缩和解压缩文件 简单快速的解压缩方法...
  20. python匹配ip地址

热门文章

  1. 二硫键交联的巯基化壳聚糖水凝胶/pH、离子强度敏感性的壳聚糖水凝胶CS-GA-ASP
  2. 原生JS实现图片爆炸特效
  3. 改进YOLOv7系列:21.添加ShuffleAttention注意力机制
  4. LeetCode476
  5. matlab求n阶行列式,发福利了,线性代数n阶行列式计算器!(需要的拿走吧)
  6. 12.21 linux前戏
  7. html怎么设置区块隐藏,网页区块隐藏/显示的切换技术
  8. 液晶屏LED背光板可以分为几类?
  9. c语言 随机四则运算,随机四则运算 C语言
  10. 库存JAVA_Java解决高并发下商品库存更新