字符串hash算法
http://www.cnblogs.com/zyf0163/p/4806951.html
hash函数对大家来说不陌生吧 ?
而这次我们就用hash函数来实现字符串匹配。
首先我们会想一下二进制数。
对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例):

hash用的也是一样的原理,为每一个前缀(也可以后缀,笔者习惯1 base,所以喜欢用前缀来计算,Hash[i] = Hash[i - 1] * x + s[i](其中1 < i <= n,Hash[0] = 0)。
一般地,
而对于l - r区间的hash值,则为:

但是如果n很大呢?那样不是会溢出了吗?
因此我们把hash值储存在unsigned long long里面, 那样溢出时,会自动取余2的64次方,but这样可能会使2个不同串的哈希值相同,但这样的概率极低(不排除你的运气不好)。
因此我们可以通过Hash值来比较两个字符串是否相等。
给出多项式hash的处理:
typedef unsigned long long ull;
const int N = + ;
const ull base = ;
char s[N];
ull hash[N]; void init(){//处理hash值
p[] = ;
hash[] = ;
int n = strlen(s + );
for(int i = ; i <=; i ++)p[i] =p[i-] * base;
for(int i = ; i <= n; i ++)hash[i] = hash[i - ] * base + (s[i] - 'a');
} ull get(int l, int r, ull g[]){//取出g里l - r里面的字符串的hash值
return g[r] - g[l - ] * p[r - l + ];
}

题目大意:
是有一份文件,前面是密文,后面是原文,但那个人接到这个文件后不知道中间从哪里开始是原文,所以你要帮忙还原一下,如果后面原文比密文少,你就将它补全, 第一行是密文转换格式,例如第二个样例表示将q翻译成a,w翻译成b。
思路:
我们只要先把密文都翻译成明文,然后去比较原来的字符串的后缀和翻译之后的字符串前缀的最长匹配长度就行(注:最长匹配的长度不能超过原长的一半)
hash水题(附AC代码):
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef unsigned long long ull;
const int N = + ;
const ull base = ;
ull Hash1[N], Hash2[N], p[N]; char s[N], t[], r[N]; int T; int c[]; void init(){
p[] = ;
for(int i = ; i <=; i ++)p[i] =p[i-] * base;
} ull get(int l, int r, ull g[]){
return g[r] - g[l - ]*p[r - l + ];
} void work(){
for(int i = ; i < ; i ++) c[t[i] - 'a'] = i;
//puts(r+1);
int n = strlen(s + );
Hash1[] = Hash2[] = ;
for(int i = ; i <= n; i ++){
Hash1[i] = Hash1[i - ] * base + (s[i] - 'a');
Hash2[i] = Hash2[i - ] * base + (c[s[i] - 'a']);
}
int ans = n;
for(int i = n; i < n * ; i ++){
if(i & ) continue;
int tmp = i / ;
int len =n - tmp;
ull s1 = get(, len, Hash2);
ull s2 = get(n - len + , n, Hash1);
if(s1 == s2){
ans = tmp;
break;
}
//printf("%llu %llu\n", s1, s2);
}
//printf("ans = %d\n", ans);
for(int i = ; i <= ans; i ++)printf("%c", s[i]);
for(int i = ; i <= ans; i ++)printf("%c", c[s[i]-'a'] + 'a');
puts("");
} int main(){
scanf("%d", &T);
init();
while(T--){
scanf("%s%s", t, s + );
work();
}
return ;
}
字符串hash算法的更多相关文章
- 记录几个经典的字符串hash算法
记录几个经典的字符串hash算法,方便以后查看: 推荐一篇文章: http://www.partow.net/programming/hashfunctions/# (1)暴雪字符串hash #inc ...
- 字符串Hash算法比较
基本概念所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2).设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m> ...
- HDU 1880 魔咒词典 (字符串hash)
<题目链接> 题目大意: 就是每个字符串有一个配套的对应字符串,询问的时候,无论输出其中的哪一个字符串,输出另一个,如果不存在这个字符串,直接输出"what?". 解题 ...
- 字符串hash与字典树
title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...
- 转载:字符串hash总结(hash是一门优雅的暴力!)
转载自:远航休息栈 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; 搞糟 ...
- hadoop Partiton中的字符串Hash函数改进
最近的MapReduce端的Partition根据map生成的Key来进行哈希,导致哈希出来的Reduce端处理任务数量非常不均匀,有些Reduce端处理的数据量非常小(几分钟就执行完成,而最后的pa ...
- 转载:字符串HASH
转载自:Slager_Z 字符串Hash总结 Hash是什么意思呢?某度翻译告诉我们: hash 英[hæʃ] 美[hæʃ]n. 剁碎的食物; #号; 蔬菜肉丁;vt. 把…弄乱; 切碎; 反复推敲; ...
- 89.hash算法实现CSDN密码处理
初始化,数据的行数,hash链表结构体,存储头结点 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdl ...
- 字符串Hash学习笔记
[toc] # 以下内容作废,太多错误了,等我有时间重写 说一下什么是Hash,说白了就是把一大坨字符用一些神奇的数来表示,可以说是把字符加密了. 简单一点就是一个像函数一样的东西,你放进去一个值,它 ...
随机推荐
- VMware Workstation安装MAC OS X系统
http://jingyan.baidu.com/article/ff411625b9011212e48237b4.html
- iOS交互WebService(cxf框架)
公司后台java用的cxf框架,说是iOS.Android.web客户端都可以通用,但是我还是第一次遇到,所以做的时候遇到了不小的坑.下面总结下我开发中遇到的问题以及解决方案: 首先,后台提供了一份接 ...
- PHP的几个常用函数的使用总结
1.date函数:不得不说,PHP的date函数已经基本很完备了,如果你不去读PHP的手册的话,你不会发现对日期做了那么多的支持. time() 获取当前的时间戳 data() 获取自己想要的时间格 ...
- 如何利用Matlab进行ROC分析
ROC曲线基本知识: 判断分类器的工作效率需要使用召回率和准确率两个变量. 召回率:Recall,又称"查全率", 准确率:Precision,又称"精度".& ...
- 克隆虚拟机重启服务时 Error:No suitable device found: no device found for connection "System eth0"
故障说明: 在克隆几台虚拟机,发现启动后不能配置IP地址等信息,使用linux命令: “ifup eth0”也不能激活网卡, 而在使用"service network restart&quo ...
- Mysql 根据时间戳、时间按年月日分组统计
create_time时间格式 SELECT DATE_FORMAT(create_time,'%Y%u') weeks,COUNT(id) COUNT FROM role GROUP BY week ...
- 路线更改事件 $routeChangeStart 与 $locationChangeStart
$routeChangeStart属于$route模块,使用将要改变的路由和当前路由对比,在没有跳转之前 参数包括 function(event, next, current) next $loca ...
- BZOJ 3675 序列分割
斜率优化.注意要判分母为0的情况.dp数组可以滚一维. #include<iostream> #include<cstdio> #include<cstring> ...
- IE6,IE7文档模式下 按钮type=submit在页面打开时会有一条黑线边框的处理方法。(转)
一:按钮border:none:同时使用背景图片来实现border效果. 二:在按钮外面嵌套一层label标签,里面的按钮input[type="submit"]的border:n ...
- 在阿里云ECS上搭建LEMP环境
在阿里云买ECS的时候选择自己习惯的镜像系统,我一般都是使用Linux Ubuntu,所以,以下的配置都是在Ubuntu 14.04稳定支持版的环境中搭建Linux+Nginx+Mysql+PHP环境 ...