内容参考《算法竞赛进阶指南》

之前集训的时候听老师讲过,字符串题目中,hash一般不是正解,但是是一个优秀的暴力,可以拿比较多的部分分。

hash涉及内容很多,这里只讨论字符串hash

可以把字符串看成一个131进制位数,然后用ull储存,大过2的64次方后自动取模。

这样的话hash值相等的话可以认为两个字符串是一样的(极少概率不一样)

所以对于一个字符串,我们可以用O(n)的时间内算出所有前缀的hash值,然后就可以用

O(1)的时间算出任意一段区间的hash值(类比二进制操作,具体看代码)。

Hash大法吼啊!!!

怎么用呢?

问题:给你一个字符串,每次询问两个区间[l1, r1][l2, r2],判断两个区间的字符是否相等

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; typedef unsigned long long ull;
const int MAXN = 1e6 + 10;
const int base = 131;
char s[MAXN];
int n, q;
ull p[MAXN], f[MAXN]; inline ull cut(int l, int r)
{
return f[r] - f[l - 1] * p[r - l + 1];
} int main()
{
scanf("%d%d", &n, &q); //n为字符串长度
scanf("%s", s + 1);
p[0] = 1;
_for(i, 1, n)
{
f[i] = f[i - 1] * base + (s[i] - 'a' + 1);
p[i] = p[i - 1] * base;
}
while(q--)
{
int l1, r1, l2, r2;
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
if(cut(l1, r1) == cut(l2, r2)) puts("Yes");
else puts("No");
}
return 0;
}

用Hash大法解决kmp问题

比较hash值就好了,非常简单粗暴!!!(但效率比KMP慢一些,所以说是一个优秀的暴力)

caioj 1177 KMP模版

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; typedef unsigned long long ull;
const int MAXN = 1e6 + 10;
const int base = 131;
char a[MAXN], b[MAXN];
int n, q, lena, lenb;
ull p[MAXN], f[MAXN], t; inline ull cut(int l, int r)
{
return f[r] - f[l - 1] * p[r - l + 1];
} int main()
{
scanf("%s%s", a + 1, b + 1);
lena = strlen(a + 1); lenb = strlen(b + 1);
p[0] = 1;
_for(i, 1, lena)
{
f[i] = f[i - 1] * base + (a[i] - 'a' + 1);
p[i] = p[i - 1] * base;
}
_for(i, 1, lenb) t = t * base + (b[i] - 'a' + 1);
_for(i, 1, lena)
{
if(cut(i, i + lenb - 1) == t)
{
printf("%d %d\n", i, i + lenb - 1);
break;
}
if(i == lena) puts("NO");
}
return 0;
}

Hash大法的更多相关文章

  1. hdu5183 hash大法

    维护前缀和sum[i]=a[0]-a[1]+a[2]-a[3]+…+(-1)^i*a[i]枚举结尾i,然后在hash表中查询是否存在sum[i]-K的值.如果当前i为奇数,则将sum[i]插入到has ...

  2. NOIP 2014 D2T3 解方程 Hash大法好

    题目大意:给定高次方程an*x^n+...+a1*x^1+a0*x^0=0 求[1,m]区间内有多少个整数根 ai<=10^10000.m<=100W 懒得高精,考场上写的long dou ...

  3. LeetCodeTwo Sum IV 树的遍历+Hash大法好

    题意 给定一颗二叉搜索树,返回是否存在两个节点的值之和为给定值K. 思路 同Two Sum.使用Hash表解决.只是要写个树的遍历而已,选取DFS. 源码 class Solution { publi ...

  4. POJ 1743 Musical Theme Hash+二分法

    标题效果:有一个美丽的旋律,它们是由一些不大于88音调.如果计为五个音调的量度,问:是否有相同的节奏的多个部分(相同的差,以及两者之间的相同的节奏不能重叠),并寻求最长长度. 思考:这个问题是八人中的 ...

  5. 【线段树 集合hash】bzoj4373: 算术天才⑨与等差数列

    hash大法好(@ARZhu):大数相乘及时取模真的是件麻烦事情 Description 算术天才⑨非常喜欢和等差数列玩耍.有一天,他给了你一个长度为n的序列,其中第i个数为a[i].他想考考你,每次 ...

  6. LeetCode longest substring without repeating characters 题解 Hash表

    题目 Given a string, find the length of the longest substring without repeating characters. Example 1: ...

  7. 【Tyvj 1060】【NOIP 2005】等价表达式

    设a为一个质数,模数为另一个质数,然后暴力算多项式的答案,如果答案相等就认为两个多项式相等. 这种hash有出错概率的题为什么还是要用hash呢?因为出错的概率实在太小了,a和模数的值取得好出题人根本 ...

  8. bzoj4264: 小C找朋友

    hash大法好 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...

  9. bzoj4337: BJOI2015 树的同构

    hash大法好 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...

随机推荐

  1. django与mysql实现简单的增删查改

    模型定义 from django.db import models class Grades(models.Model): g_name = models.CharField(max_length=2 ...

  2. web前端对文件的引用规则

    web前端一般常用文件 .html .css .js.但是当用css文件和html引入资源(比如图片)时,路径可能不相同.下面总结了几条. 使用相对路径引入规则: html或者js引入图片,按照htm ...

  3. Oracle-定时任务

    PLSQL->新建->命令行窗口 --存储过程 create or replace procedure prd_remove_error_data AS BEGIN UPDATE rpt_ ...

  4. hive 配置注意事项及初始化hive 元数据

    今天配置hive 犯了一个问题:下载的hive tar.gz 里的conf文件夹仅仅有一个 hive-default.xml.template,于是我就cp  了一份命名为:hive-default. ...

  5. notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比如lua、python等)

    在程序开发过程中,程序员经常用到的一个功能就是查找引用(Find Reference),Visual Studio里面的对应功能是“查找所有引用”(Find All References). 我在使用 ...

  6. WebRTC开源项目一览之二

    .Kurento视频直播系统4.1  应用实例搞视频会议就会涉及一对多.多对多.广播.转码.混音.合屏.录制,这就需要用到流媒体服务器,而kurento就具有这些功能.他主要用来作为webrtc的流媒 ...

  7. Swift 字符串的分割

    componentsSeparatedByString 就是根据 传递的 一个字符,进行字符串的一个分割 // 分割字符串 - > let sourceArray = source.compon ...

  8. 在Maven中引入spring的DAO、DOMAIN、CONTROLLER、VIEW

    除了mysql外麻雀虽小,五脏俱全. 参照之前的博客建立好的maven项目如图. 第一步 : 向maven项目中的pom文件添加依赖 ,然后maven install

  9. 【转】C# ABP WebApi与Swagger UI的集成

    以前在做WebAPI调用测试时,一直在使用Fiddler测试工具了,而且这个用起来比较繁琐,需要各种配置,并且不直观,还有一点是还得弄明白URL地址和要传递的参数,然后才能调用.  最近新入职,公司里 ...

  10. input[type='file']获取上传文件路径案例

    最近在项目时,需要获取用户的上传文件的路径,便写了一个demo: <body> <input type="file" name="" valu ...