ELFHash

HDU1800

这题的大意是求出现次数最多的数。所以这题我直接用map做了。

811MS 1876K 差点超时了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 map<string,int> mp;
 4
 5 int main(){
 6     ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);cerr<<"";
 7     int n;
 8     while(cin>>n){
 9         mp.clear();
10         string str;
11         for(int i = 0; i < n; i ++){
12             cin>>str;
13             int j = 0;
14             for(;j < str.size();j++)if(str[j] != ‘0‘) break;
15             mp[str.substr(j)]++;
16         }
17         int ans = 0;
18         for(auto m : mp){
19             ans = max(ans , m.second);
20         }
21         cout<<ans<<endl;
22     }
23     return 0;
24 }

发现网上有一种用ELFHash的做法,就仔细研究了下,由于是位运算,看了好久。

EFLHash模板是:

 1 unsigned int ELFHash(char *str){
 2     unsigned int h = 0;
 3     unsigned int x;
 4     while(*str){
 5         h = (h << 4) + *str++;
 6         x = h & 0xF0000000L;
 7         if(x){
 8             h ^= x>>24;
 9             h &= ~x;
10         }
11     }
12     return h & 0x7FFFFFFF;
13 }

参考了@ACdreamers的文章

h = (h << 4) + *str++;   将当前的字符的ASCII的高4位与前一个字符的第4位相加,而低4位存在h中。x = h & 0xF0000000L;    取出h中最高4位,0xF0000000L代表29~32这4位为1,其余为0。如果最高4位不为0,则说明字符多与7个,如果不处理的就加入下一个字符的话,第一个字符会被移出去,新加入的4位为1~4,所以要>>24.(h ^= x>>24;)h &= ~x;      表示把h的高4位清空。全部代码为:608MS   2456K  这个时间比之前用map快了一些了。
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int Mod = 1e5+7;
 4 int Hash[Mod], cnt[Mod];
 5 unsigned int ELFHash(char *str){
 6     unsigned int h = 0;
 7     unsigned int x;
 8     while(*str){
 9         h = (h << 4) + *str++;
10         x = h & 0xF0000000L;
11         if(x){
12             h ^= x>>24;
13             h &= ~x;
14         }
15     }
16     return h & 0x7FFFFFFF;
17 }
18 int Hashhit(char *str){
19     while(*str == ‘0‘) str++;
20     int k = ELFHash(str);
21     int t = k % Mod;
22     while(Hash[t] && Hash[t] != k) //有可能发生碰撞,就要清除这个冲突
23         t = (t + 10) % Mod;
24     if(Hash[t] == 0) Hash[t] = k;
25     return ++cnt[t];
26 }
27 int main(){
28     int n;
29     char str[33];
30     while(~scanf("%d",&n)){
31         memset(Hash,0,sizeof(Hash));
32         memset(cnt,0,sizeof(cnt));
33         int ans = 0;
34         for(int i = 0 ; i < n; i ++){
35             scanf("%s",str);
36             ans = max(ans,Hashhit(str));
37         }
38         printf("%d\n",ans);
39     }
40     return 0;
41 }

 
时间: 2024-10-10 06:07:14

ELFHash的相关文章

ELFhash函数

这是一个很有用的HASH 的函数,对长短字符串都很有用. 代码: 1 // ELF Hash Function 2 unsigned int ELFHash(char *str) 3 { 4 unsigned int hash = 0; 5 unsigned int x = 0; 6 7 while (*str) 8 { 9 hash = (hash << 4) + (*str++);//hash左移4位,把当前字符ASCII存入hash低四位. 10 if ((x = hash &

字符串哈希之ELFHash,poj2503

#include <iostream> #include<cstdio> #include<cstring> using namespace std; const int M = 149993; typedef struct { char e[11]; char f[11]; int next; }Entry; Entry entry[M]; int i = 1; int hashIndex[M];//哈希表 int ELFHash(char *key) { unsig

Hash Compared &amp; ELFHash 详解

部分转载自here 常用HASH算法 代码 & 比较 常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎不可能找到碰撞. 常用字符串哈希函数有BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash,PJWHash,ELFHash等等.对于以上几种哈希函数,我对其进行了一个小小的评测. Hash函数 数据1 数据

字符串哈希函数ELFHash的理解

unsigned long ElfHash ( const unsigned char *name ) { unsigned long   h = 0, g; while ( *name ) { h = ( h << 4 ) + *name++; if ( g = h & 0xF0000000 )//如果最高位不为0,则说明字符已经7个,如果不处理,再加第八个字符时,第一个字符会被移出 //因此要有如下处理是每一个字符都对字符串的值进行影响. h ^= g >> 24;//

Linux动态库相关知识整理

动态库和静态库在C/C++开发中很常见,相比静态库直接被编译到可执行程序, 动态库运行时加载使得可执行程序的体积更小,更新动态库可以不用重新编译可执 行程序等诸多好处.作者是一个Linux后台开发,这些知识经常用到,所以 整理了一下这方面的知识.静态库相对简单,本文只关心Linux平台下的动态库. 创建动态库 这里我把一个短小却很有用的哈希函数编译成动态库做为示例,ELFhash用于对字符串做哈希,返回一个无符号整数. //elfhash.h #include <stdio.h> unsign

哈希(Hask)

 编辑 Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. HASH函数(计算机算法领域) 中文名 散列 外文名 Hash 音    译 哈希 表    示 任意长度的输入

哈希算法

/*** Hash算法大全<br>* 推荐使用FNV1算法* @algorithm None* @author Goodzzp 2006-11-20* @lastEdit Goodzzp 2006-11-20* @editDetail Create*/public class HashAlgorithms{    /**//**    * 加法hash    * @param key 字符串    * @param prime 一个质数    * @return hash结果    */   

Bloom filter的实现以及常用的hash函数

bloom filter利用时间换空间的思想,利用多个哈希函数,将一个元素的存在状态映射到多个bit中,特别是在网络环境中,BF具有广泛的用途,关键问题就是要减少false positive rate(可以设置参数来调节),扩展有 counting BF.这里选用的hash函数是表现较好的 BKDRHash , SDBMHash, DJBHash . Bloom-filter代码: bloom_filter.h #ifndef __BLOOM_FILTER_H__ #define __BLOOM

Lucene4.6+Solr4.6实战开发垂直搜索引擎 Lucene4.6实战视频教程

<基于Lucene4.6+Solr4.6+Heritrix1.14+S2SH实战开发从无到有垂直搜索引擎> 课程讲师:小叶子 课程分类:Java 适合人群:初级 课时数量:69课时 用到技术:Hibernate.Struts.Spring.jQuery.Lucene.Solr.Heritrix 涉及项目:百度文库搜索引擎 垂直搜索引擎是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户.垂直