POJ2503 Babelfish map或者hash_map

POJ2503 这是一道水题,用Map轻松AC。

不过,可以拿来测一下字符串散列, 毕竟,很多情况下map无法解决的映射问题需要用到字符串散列。

自己生成一个质数, 随便搞一下。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string.h>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1e+6;
const int P=999983;
unsigned int base[100];
int dic[maxn];
char eng[100010][11];
inline void  init_hash(char* s,int h[])
{
 int l=strlen(s);
 h[0]=0;
 for(int i=1;i<=l;++i)
 	{
 	 h[i]=(h[i-1]*26+s[i-1])%P;
	}
 base[0]=0;
 for(int i=1;i<=l;i++)
 	base[i]=(base[i-1]*26)%P;
}

inline unsigned int string_hash(char* s,int h[], int l, int r)//[l,r)左闭右开
{
 init_hash(s,h);
 return (h[r]-h[l]*base[r-1])%P;
}
 int ha[maxn];
int main()
{freopen("t.txt","r",stdin);
 //ios::sync_with_stdio(false);
 memset(dic,0,sizeof(dic));
 char lan[11];
 int ditlen=1,tot=0;
 eng[0][0]=‘e‘;
 eng[0][1]=‘h‘;
 eng[0][3]=‘\0‘;
 while(true)
 	{
 	 char t=getchar();
 	 if(t==‘\n‘)break;
 	 int len=1;
 	 eng[ditlen][0]=t;
 	 while(true)
 	 	{
 	 	 t=getchar();
 	 	 if(t==‘ ‘){eng[ditlen][len++]=‘\0‘;ditlen++;break;}
 	 	 eng[ditlen][len++]=t;
		}
	 int lent=0;
	 while(true)
	 	{
	 	 t=getchar();
	 	 if(t==‘\n‘){lan[lent++]=‘\0‘;break;}
	 	 lan[lent++]=t;
		}
	 int leng=strlen(lan);
	 int has=string_hash(lan,ha,0,leng);
	 while(has<0)has+=P;
	 dic[has]=ditlen-1;
	}
 while(scanf("%s",lan)!=EOF)
 	{
 	 int has=string_hash(lan,ha,0,strlen(lan));
 	  while(has<0)has+=P;
 	 has=dic[has];
 	 for(int i=0;;i++)
 	 	{
 	 	 if(eng[has][i]==‘\0‘)break;
 	 	 printf("%c",eng[has][i]);
		}
	 printf("\n");
	}
 return 0;
}

  

时间: 2024-12-28 20:21:33

POJ2503 Babelfish map或者hash_map的相关文章

POJ2503——Babelfish(map映射+string字符串)

Babelfish DescriptionYou have just moved from Waterloo to a big city. The people here speak an incomprehensible dialect of a foreign language. Fortunately, you have a dictionary to help you understand them.InputInput consists of up to 100,000 diction

POJ2503 Babelfish

问题链接:POJ2503 Babelfish. 这个问题只是一个字典问题,自然用map来实现.问题的关键是时间上能否更快. 本来是想用类unordered_map(采用哈希搜索的map)来编写程序,编译不支持,只好改为map. 这个问题用类unordered_map来编写程序,时间上会更快一些,也更为合理. AC通过程序如下: /* POJ2503 Babelfish */ #include <iostream> #include <string> //#include <u

Map和hash_map

map和hash_map 今天在写拼流的程序时碰到一个问题,要根据流的四元组的结构信息映射到该流的数据.也就是我在网络数据包拼接的过程中,要根据包的地址和端口信息,对应到其对应的一个流的数据上去,把端口和地址信息相同的包的数据段中的数据组装起来.自然想到用map,不过map要求其关键码类型提供一个小于操作,而我的这种四元组信息没有大小的关系,于是自然就想到用hash_map.    hash_map基于哈希表,它对数据的存储和查找所需的时间大大降低,几乎可以看成是常数时间(理想情况下是O(1))

map、hash_map、unordered_map 的思考

#include <map> map<string,int> dict; map是基于红黑树实现的,可以快速查找一个元素是否存在,是关系型容器,能够表达两个数据之间的映射关系. dict.insert(make_pair("abc",1)); dict.count("mn"); 看看dict中含有 mn的个数,因为元素是唯一的,所以这个返回值只有两种情况,0或者1. (multi_map就不是这样啦) dict.find("mn&q

STL中map与hash_map容器的选择

[转]STL中map与hash_map容器的选择 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的.做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了.今天改进代码,顺便又来温习基础功课了. 还记得Herb Sutter那极有味道的<C++对话系列>么,在其中<产生真正的hash对象>这个故事里就讲了map的选择.顺便回顾一下,也讲一下我在实用中

STL中map与hash_map的比较

1. map : C++的STL中map是使用树来做查找算法; 时间复杂度:O(log2N) 2. hash_map : 使用hash表来排列配对,hash表是使用关键字来计算表位置; 时间复杂度:O(1), 最坏的时间复杂度:O(n) 总体来说:hash_map 比 map 查找速度快,而且查找速度基本和数据量大小无关,属于常数级别,节省一定内存,如果没有必要排序的话,尽量使用 hash_map . 注:hash还有hash函数的耗时.当有100w条记录的时候,map也只需要20次的比较,20

关于STL中的map和hash_map

以下全部copy于:http://blog.chinaunix.net/uid-26548237-id-3800125.html 在网上看到有关STL中hash_map的文章,以及一些其他关于STL map和hash_map的资料,总结笔记如下:     1.STL的map底层是用红黑树实现的,查找时间复杂度是log(n):     2.STL的hash_map底层是用hash表存储的,查询时间复杂度是O(1):     3.什么时候用map,什么时候用hash_map?     这个药看具体的

C++回顾 统计词频问题 -- vector、map、hash_map(三种方式时间比较)

本博文我们通过三个程序比较统计词频问题的时间复杂度问题: 问题描述; 1).找一篇文章,将所有单词输入至程序:(The Bible Holy为例) 2).统计出每个单词的数量,即词频问题: 3).增加停用词功能:(遇到此类词,直接略过)(网上搜) 4).分别统计出读取文件并计算词频时间.排序所用时间: 5).用 类 实现各函数(处统计时间的函数除外). vector.map.hash_map 都要处理字符串的 去除标点符号.将大写字母转换成小写字母.不对数字进行统计 问题.因此,我们可以将处理这

STL 中的map 与 hash_map的理解

可以参考侯捷编著的<STL源码剖析> STL 中的map 与 hash_map的理解 1.STL的map底层是用红黑树存储的,查找时间复杂度是log(n)级别: 2.STL的hash_map底层是用hash表存储的,查询时间复杂度是常数级别: 3.什么时候用map,什么时候用hash_map? 这个要看具体的应用,不一定常数级别的hash_map一定比log(n)级别的map要好,hash_map的hash函数以及解决地址冲突等都要耗时,而且众所周知hash表是以空间效率来换时间效率的,因而h