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

之前集训的时候听老师讲过,字符串题目中,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;
}

最新文章

  1. outlook 2016 for windows 每次刷新发送接收邮件会弹出登陆界面
  2. .net 微信分享功能
  3. 重构Web Api程序(Api Controller和Entity)续篇
  4. 【wikioi】1014 装箱问题
  5. ubuntu环境极其内存情况
  6. PHP使用SnowFlake算法生成唯一ID
  7. 分页存储过程--From:桌面备份 -&gt; sql2005新功能.docx
  8. Flex 百度地图API使用
  9. 经常使用MD5算法代码
  10. 使用rsync无密码传输
  11. python链接mysql获得某列最大值
  12. Java实现简单记事本
  13. php字符串统计次数的各种方法(转)
  14. Python之随机梯度下降
  15. aliyun服务器对象存储oss
  16. python之路---10 *args **kwargs 命名空间 作用域 函数的嵌套
  17. Redis持久化之RDB&amp;&amp;AOF的区别
  18. Locust性能测试5-参数化批量注册
  19. maven 结合mybaits整合框架,打包时mapper.xml文件,mapper目录打不进war包去问题
  20. python学习,day4:装饰器的使用示例2

热门文章

  1. vue使用SockJS实现webSocket通信
  2. HDU5976 Detachment
  3. Java - 经常使用函数Random函数
  4. 运行shell命令
  5. c11---位运算相关
  6. Swift - 使用CollectionView实现图片Gallery画廊效果(左右滑动浏览图片)
  7. 软件测试中的fault,error,failure
  8. input 框输入数字相关
  9. 【摘录】JAVA内存管理-自动选择垃圾收集器算法
  10. C++函数的高级特性——小结