字符串HASH模板
//注意MAXN是最大不同的HASH个数,一般HASHN是MAXN的两倍左右,MAXLEN表示字符串的最大长度
//K表示正确率,越大正确率越高,当时也越费空间,费时间。
//使用前注意初始化hash_init();
//用法参考下面注释程序。
//HashNode里面可以储存很多信息,注意灵活使用。 内存如果可能溢出可修改使得内存减一半,但是注意乘法溢出。
#define HASHN 1000007
#define MAXN 500000
#define MAXLEN 500500
#define K 2 typedef unsigned long long ull;
typedef unsigned int ui;
struct HashNode
{
int next;
ull key[K];//关键点
}hashnode[MAXN]; const ull mod[]={ 2147483647U, 2147483629U, 2147483587U };
const ull seed[]={ 131U, 10007U, 4243U};
int hashpre[ HASHN ],hashcnt; void hash_init()
{
hashcnt=;
memset(hashpre,-,sizeof(hashpre));
} bool hash_find(ull key[K])
{
int hashkey=;
for(int i=;i<K;i++)
hashkey += (key[i])%HASHN;
hashkey %= HASHN;
ull nkey[K];
for(int p=hashpre[hashkey];p!=-;p=hashnode[p].next)
{
for(int i=;i<K;i++) nkey[i] = hashnode[p].key[i];
bool nsign=;
for(int i=;i<K;i++)
{
if(key[i] != nkey[i])
{
nsign=;
break;
}
}
if(nsign==) return true;
}
return false;
} void hash_insert(ull key[K])
{
int hashkey=;
for(int i=;i<K;i++)
hashkey += (key[i])%HASHN;
hashkey %= HASHN; if( hash_find(key) ) return ;//hash表中已经存在 //不存在使用头插入法,插入新节点。
for(int i=;i<K;i++)
hashnode[hashcnt].key[i] = key[i];
hashnode[hashcnt].next = hashpre[hashkey];
hashpre[ hashkey ] = hashcnt++;
} void hash_getkey(char *str,int len,ull key[K])
{
ull tmp=;
for(int i=;i<K;i++)
{
key[i] = ;
tmp = ;
for(int j=;j<len;j++)
{
key[i] = ( key[i]+tmp*str[j] )%mod[i];
tmp *= seed[i];
tmp %= mod[i];
}
}
return ;
} void hash_insert(char *str,int len)
{
ull key[K];
hash_getkey(str,len,key);
hash_insert(key);
} bool hash_find(char *str,int len)
{
ull key[K];
hash_getkey(str,len,key);
return hash_find(key);
} void hash_getpow(int len,ull hashpow[][MAXLEN])
{
ull tmp=;
for(int i=;i<K;i++)
{
tmp=;
for(int j=;j<len;j++)
{
hashpow[i][j] = tmp;
tmp *= seed[i];
tmp %= mod[i];
}
}
} void hash_getsuffix(char *str,int len,ull hashsuf[][MAXLEN])
{
ull tmp=;
for(int i=;i<K;i++)
{
tmp=;
for(int j=;j<len;j++)
{
hashsuf[i][j] = (tmp*str[j])%mod[i];
tmp *= seed[i];
tmp %= mod[i];
}
hashsuf[i][len]=;
for(int j=len-;j>=;j--)
{
hashsuf[i][j] += hashsuf[i][j+];
if( hashsuf[i][j]>=mod[i] ) hashsuf[i][j] -= mod[i];
}
}
} void hash_getprefix(char *str,int len,ull hashpref[][MAXLEN])
{
ull tmp=;
for(int i=;i<K;i++)
{
hashpref[i][] = str[];
tmp = seed[i];
for(int j=;j<len;j++)
{
hashpref[i][j] = hashpref[i][j-]+(tmp*str[j])%mod[i];
if( hashpref[i][j]>=mod[i] ) hashpref[i][j] -= mod[i];
tmp *= seed[i];
tmp %= mod[i];
}
}
} /*
char str[1001000];
ull hashpow[K][MAXLEN],hashpref[K][MAXLEN],hashsuf[K][MAXLEN]; int main() {
int n,m;
scanf("%d%d",&n,&m); hash_init();//第一步初始化 for(int i=0;i<n;i++)
{
scanf("%s",str);
int len=strlen(str);
hash_insert(str,len);//插入hash表
} hash_getpow(MAXLEN, hashpow);//得到pow for(int i=0;i<m;i++)
{
scanf("%s",str);
int len=strlen(str);
int flag=0; hash_getprefix(str, len, hashpref);//得到前缀和
hash_getsuffix(str, len, hashsuf);//得到后缀和 //具体情况,具体操作。
for(int j=0;j<len;j++)
{
for(int k='a';k<='c';k++)
{
if(k==str[j]) continue; ull key[K];
for(int p=0;p<K;p++)
{
key[p] =( (j>0?hashpref[p][j-1]:0) + hashpow[p][j]*k%mod[p]+hashsuf[p][j+1])%mod[p];
while(key[p]>=mod[p]) key[p] -= mod[p];
}
if( hash_find(key) )
{
flag=1;
break;
}
}
if(flag) break;
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
} */
字符串HASH模板的更多相关文章
- hdu 4622 Reincarnation 字符串hash 模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给定一个长度不超过2000的字符串,之后有不超过1e5次的区间查询,输出每次查询区间中不同 ...
- hdu-4080 Stammering Aliens 字符串hash 模板题
http://acm.hdu.edu.cn/showproblem.php?pid=4080 求出现次数大于等于n的最长串. #include<iostream> #include< ...
- 字符串hash 模板
typedef long long ll; typedef unsigned long long ull; #define maxn 1005 struct My_Hash { ull ; ull p ...
- 字符串HASH 学习总结 && 模板
一.字符串HASH模板 取自挑战程序设计竞赛(第2版) </pre><pre code_snippet_id="446698" snippet_file_nam ...
- poj 3461 字符串单串匹配--KMP或者字符串HASH
http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include ...
- cf244D. Match & Catch 字符串hash (模板)或 后缀数组。。。
D. Match & Catch 能够用各种方法做.字符串hash.后缀数组,dp.拓展kmp,字典树.. . 字符串hash(模板) http://blog.csdn.net/gdujian ...
- 字符串hash入门
简单介绍一下字符串hash 相信大家对于hash都不陌生 翻译过来就是搞砸,乱搞的意思嘛 hash算法广泛应用于计算机的各类领域,像什么md5,文件效验,磁力链接 等等都会用到hash算法 在信息学奥 ...
- 【字符串算法1】 再谈字符串Hash(优雅的暴力)
[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述 [字符串算法1] 字符串Hash 老版原文: RK哈希(Rabin_Ka ...
- 字符串hash&&对字符串hash的理解
对字符串hash的一些总结: 1,首先,我们在转化的时候,取底的时候一般是取131这些数,因为要避免不同的字符串对应相同的hash值这种情况的出现.如果卡精度的时候,我们可以采取双模数的方式尽量减少 ...
随机推荐
- 跟我一起透彻理解template模板模式
#include <iostream> using namespace std; //template模式. class Base { public: void DealWhat() { ...
- ASP.NET MVC学习---(三)EF简单增删改查
那么现在我们已经大概从本质上了解了ef 巴拉巴拉说了一大堆之后 总算要进入ef的正题了 总在口头说也太不行了是吧~ 没错,现在要用ef进行一些实际的操作 做什么呢? 就做一个入门级的增删改查操作吧 废 ...
- 如果你还有以下这些现象,那你仍是PHP菜鸟:
最近看了个文章,写的很精辟,跟大家分享一下,这也是我的目标: 如果你还有以下这些现象,那你仍是PHP菜鸟:1. 不会利用如phpDoc这样的工具来恰当地注释你的代码:2. 对优秀的集成开发环境如Zen ...
- 2017.7.18 windows下ELK环境搭建
参考来自:Windows环境下ELK平台的搭建 另一篇博文:2017.7.18 linux下ELK环境搭建 0 版本说明 因为ELK从5.0开始只支持jdk 1.8,但是项目中使用的是JDK 1.7, ...
- 2017.4.18 putty和fileZilla的使用
putty:用来连接环境. fileZila:用来传递文件. (1)连接环境 centOS 7 点击putty.exe,输入地址.用户名.密码进行连接.端口输入22.用账号和密码登录. 进入到目录下, ...
- 仿苹果电脑任务栏菜单&&拼图小游戏&&模拟表单控件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ionic准备之angular基础——格式化数据以及过滤器(8)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python的偏函数(partial)
偏函数就是固定原函数的某个参数,比如newadd就是固定了add方法的第一个参数,让a=3,这样对newadd方法只要传入参数B就可以实现add方法了,刚看偏函数的写法可能会不适应,因为partial ...
- Hibernate框架中的HibernateUtil
对于刚学习三层框架的人来说.每个配置文件和每个类.以及功能来说都非常新奇,时常就忘记了相关类的功能. 在这里建议编程就是要多加练习,才干熟能生巧. 这里说一下HibernateUtil类,在使用Hib ...
- 【Excle】在重复数据中对日期排序并查询最新的一条记录
现在存在以下数据: 需要查询出以下数据 姓名 日期 张三 2017-12-14 李四 2017-12-16 在E1中写入以下公式:=IF(D2=MAX(IF($C$ ...