HDU 1880 魔咒词典(字符串哈希)
Problem Description
哈利波特在魔法学校的必修课之一就是学习魔咒。据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助。
给你一部魔咒词典。当哈利听到一个魔咒时,你的程序必须告诉他那个魔咒的功能;当哈利需要某个功能但不知道该用什么魔咒时,你的程序要替他找到相应的魔咒。如果他要的魔咒不在词典中,就输出“what?”
Input
首先列出词典中不超过100000条不同的魔咒词条,每条格式为:
[魔咒] 对应功能
其中“魔咒”和“对应功能”分别为长度不超过20和80的字符串,字符串中保证不包含字符“[”和“]”,且“]”和后面的字符串之间有且仅有一个空格。词典最后一行以“@END@”结束,这一行不属于词典中的词条。
词典之后的一行包含正整数N(<=1000),随后是N个测试用例。每个测试用例占一行,或者给出“[魔咒]”,或者给出“对应功能”。
Output
每个测试用例的输出占一行,输出魔咒对应的功能,或者功能对应的魔咒。如果魔咒不在词典中,就输出“what?”
题目大意:略。
思路:字符串哈希。
PS:由于这个题目的所有字符串存起来已经有20+MB,对于这个只有32MB内存限制的题目,用map< stirng, string > 只会MLE,于是只能手写hash。
PS2:主要是为了测试一下pb_ds里的hash。使用方法可以参考WC2015的论文《C++的pb_ds库在OI中的应用》。
- std::map版本(421MS 31536KB)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
typedef long long LL;
const int MAXN = 108;
std::map<int, int> dict_forward, dict_backward;
std::string a[100000], b[100000];
char str1[MAXN], str2[MAXN];
std::string tmp1, tmp2;
int n;
int gethash(const std::string &str) {
LL res = 0;
for(char c : str)
res = (res * 131 + c) % 1000000007;
return res;
}
void myfind(const std::string &s, std::map<int, int> &dict, std::string arr[]) {
auto it = dict.find(gethash(s));
if(it != dict.end()) {
std::cout<<arr[it->second]<<std::endl;
} else {
puts("what?");
}
}
int main() {
int cnt = 0;
while(gets(str1) && strcmp(str1, "@END@") != 0) {
int pos = strchr(str1, ']') - str1;
a[cnt] = std::string(str1 + 1, pos - 1);
b[cnt] = std::string(str1 + pos + 2);
dict_forward[gethash(a[cnt])] = cnt;
dict_backward[gethash(b[cnt])] = cnt;
cnt++;
}
scanf("%d", &n); getchar();
for(int i = 0; i < n; ++i) {
gets(str1);
if(*str1 == '[') {
tmp1 = std::string(str1 + 1, strlen(str1) - 2);
myfind(tmp1, dict_forward, b);
} else {
myfind(str1, dict_backward, a);
}
}
}
- cc_hash_table(265MS 32736KB)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
typedef long long LL;
const int MAXN = 108;
__gnu_pbds::cc_hash_table<int, int> dict_forward, dict_backward;
std::string a[100000], b[100000];
char str[MAXN];
std::string tmp1, tmp2;
int n;
int gethash(const std::string &str) {
LL res = 0;
for(char c : str)
res = (res * 131 + c) % 1000000007;
return res;
}
void myfind(const std::string &s, __gnu_pbds::cc_hash_table<int, int> &dict, std::string arr[]) {
auto it = dict.find(gethash(s));
if(it != dict.end()) {
std::cout<<arr[it->second]<<std::endl;
} else {
puts("what?");
}
}
int main() {
int cnt = 0;
while(gets(str) && strcmp(str, "@END@") != 0) {
int pos = strchr(str, ']') - str;
a[cnt] = std::string(str + 1, pos - 1);
b[cnt] = std::string(str + pos + 2);
dict_forward[gethash(a[cnt])] = cnt;
dict_backward[gethash(b[cnt])] = cnt;
cnt++;
}
scanf("%d", &n); getchar();
for(int i = 0; i < n; ++i) {
gets(str);
if(*str == '[') {
tmp1 = std::string(str + 1, strlen(str) - 2);
myfind(tmp1, dict_forward, b);
} else {
myfind(str, dict_backward, a);
}
}
}
- gp_hash_table(374MS 31216KB)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
typedef long long LL;
const int MAXN = 108;
__gnu_pbds::gp_hash_table<int, int> dict_forward, dict_backward;
std::string a[100000], b[100000];
char str[MAXN];
std::string tmp1, tmp2;
int n;
int gethash(const std::string &str) {
LL res = 0;
for(char c : str)
res = (res * 131 + c) % 1000000007;
return res;
}
void myfind(const std::string &s, __gnu_pbds::gp_hash_table<int, int> &dict, std::string arr[]) {
auto it = dict.find(gethash(s));
if(it != dict.end()) {
std::cout<<arr[it->second]<<std::endl;
} else {
puts("what?");
}
}
int main() {
int cnt = 0;
while(gets(str) && strcmp(str, "@END@") != 0) {
int pos = strchr(str, ']') - str;
a[cnt] = std::string(str + 1, pos - 1);
b[cnt] = std::string(str + pos + 2);
dict_forward[gethash(a[cnt])] = cnt;
dict_backward[gethash(b[cnt])] = cnt;
cnt++;
}
scanf("%d", &n); getchar();
for(int i = 0; i < n; ++i) {
gets(str);
if(*str == '[') {
tmp1 = std::string(str + 1, strlen(str) - 2);
myfind(tmp1, dict_forward, b);
} else {
myfind(str, dict_backward, a);
}
}
}
HDU 1880 魔咒词典(字符串哈希)的更多相关文章
- HDU 1880 魔咒词典 (字符串hash)
<题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...
- hdu 1880 魔咒词典
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1880 魔咒词典 Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有10 ...
- hdu 1880 魔咒词典 (字符串哈希)
魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU - 1880 魔咒词典~哈希入门
哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
- HDU 1880 魔咒词典 (Hash)
魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 1880 魔咒词典(双hash)
魔咒词典Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu 1880 魔咒字典
https://vjudge.net/problem/HDU-1880 题意:略 思路: 一开始就是想到了正确的思路,但是代码写炸了,死活过不了.这题嘛,就是建议一个魔咒与咒语的双向映射.首先用字符串 ...
- 魔咒词典 HDU - 1880 (字符串hash 单hash转int或者 双hash )
哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔咒,所以他需要你的帮助. 给你一部魔咒词 ...
- 魔咒词典(hdu 1880)
Problem Description 哈利波特在魔法学校的必修课之一就是学习魔咒.据说魔法世界有100000种不同的魔咒,哈利很难全部记住,但是为了对抗强敌,他必须在危急时刻能够调用任何一个需要的魔 ...
随机推荐
- Windows中使用OpenBLAS加速R语言计算速度
在使用R的时候会发现R对CPU的利用率并不是很高,反正当我在使用R的时候,无论R做何种运算R的CPU利用率都只有百分子几,这就导致一旦计算量大的时候计算时间非常长,会给人一种错觉(R真的在计算吗?会不 ...
- 数论 - Pairs(数字对)
In the secret book of ACM, it’s said: “Glory for those who write short ICPC problems. May they live ...
- Ubuntu彻底删除MySQL然后重装MySQL
删除 mysql sudo apt-get autoremove --purge mysql-server-5.0 sudo apt-get remove mysql-server sudo apt- ...
- 为动态添加的元素,绑定click事件
全选和取消全选 $("#quanxuan").click(function(){ $("input[name='picCheck']").prop(" ...
- WebForms 开发基础
webform开发方式 xml - 可扩展的标记语言 HTML - 超文本标记语言 运行: 点击启动按钮 - 好处:可以卡断点 弊端:启动特别慢 在html上右键,在浏览器中查看 - 好处:启动特别快 ...
- java并发编程(二)线程中断
参考:http://blog.csdn.net/ns_code/article/details/17091267 使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thre ...
- RAC初体验
什么是RAC? 几乎每一篇介绍RAC的文章开头都是这么一个问题.我这篇文章是写给新手(包括我自己)看的,所以这个问题更是无法忽视. 简单的说,RAC就是一个第三方库,他可以大大简化你的代码过程. 官方 ...
- sql语句 之聚合函数
聚合分析 在访问数据库时,经常需要对表中的某列数据进行统计分析,如求其最大值.最小值.平均值等.所有这些针对表中一列或者多列数据的分析就称为聚合分析. 在SQL中,可以使用聚合函数快速实现数据的聚 ...
- spring mvc异常统一处理(ControllerAdvice注解)
首先我的项目是一个为移动端提供的json数据的,当后台报错时如果为移动端返回一个错误页面显得非常不友好,于是通过ControllerAdvice注解返回json数据. 首先创建一个异常处理类: pac ...
- 优惠分摊算法 php版
<?php /* * 优惠分摊,算法很多,这里是从shopnc挖出来,适合优惠条件过滤的算法,实质很简单,但是理解难度还是有一点 * * 一个订单的商品,如果不参与某种活动,需要分摊优惠,一般来 ...