参考博客:点击打开链接

字符串hash典例。 这里用的是bkdrhash 法。也是最常用的冲突最少的一种。原理:把字符串和数值对应。这里用base=31(一般用质数),

先是扫一遍,处理处每个位子到结尾构成的串的hash值(倒过来的),然后长度为l的子串的haash值就好算了。

之后枚举开头l个,每次向后翻滚,复杂度max(L*M, L*(S.SIZE/M))可以过,这里用了map判重下。若枚举开头扫一遍,姿势不优越过不了,极限可能:m=50000,l=1,复杂度(s,size*m)会超时。

关键一:那里求hash值的时候+1,否则100,10这种hash值一样。

开始担心这样减hash值会因为爆出现负值。其实不然:其一,  unsigned long long ,自动取模

其二:因为每次从后面向前推导:hash[i] = hash[i+1]*base+s[i]-‘a‘+1; ,本质自动取模,所以:hash[i]=s[i]-‘a‘+1+hash[i+l]*nbase[l] (每步自动取模),由于 s[i]-‘a‘+1  非负,所以有

hash[i]>hash[i+l]*nbase[l]

WA:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int maxn = 100050;
const int seed = 31;
int l,m;
unsigned long long base[maxn],h[maxn],seq[maxn],ans[maxn];
char str[maxn];int calc(int left,int len)
{int right = left + len - 1;return h[left] - h[right+1]*base[len];
}int main()
{   base[0] = 1;for(int i = 1; i <= maxn; i++)base[i] = base[i-1]*seed;while(scanf("%d%d",&m,&l)!=EOF){getchar();scanf("%s",str);int len = strlen(str);h[len] = 0;for(int i = len-1; i >= 0; i--)h[i] = h[i+1]*seed + str[i] - 'a' + 1;memset(seq,0,sizeof(seq));memset(ans,0,sizeof(ans));for(int i = 0; i < m; i++) ans[i] = 1;for(int i = 0; i < len - m; i++){int key = calc(i,m);seq[i] = key;if(i < m) continue;if(seq[i] != seq[i-m])ans[i] = ans[i-m] + 1;}int sum = 0;for(int i = 0; i < len; i++)if(ans[i] >= l)sum += ans[i] - l + 1;printf("%d\n",sum);}return 0;
}

AC:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
typedef unsigned long long ull;
using namespace std;
const int maxn= 100050;
const ull base =31;
ull nbase[maxn],hash[maxn];
int m,l;
map<ull, int> mp;
int main()
{ull tmp;nbase[0] = 1;for (int i = 1;i<maxn; i++){nbase[i]=nbase[i-1]*base;}while (~scanf("%d%d",&m,&l)){string s;cin>>s;int slen=s.size();hash[slen] = 0;for (int i = slen-1; i >= 0; i--)hash[i] = hash[i+1]*base+s[i]-'a'+1;           //关键1int ans = 0;for (int i = 0; i<l&&i+m*l<=slen; i++){mp.clear();for (int j = i; j<i+m*l; j += l){tmp = hash[j] - hash[j+l]*nbase[l];mp[tmp]++;}if (mp.size() ==m)ans++;for (int j=i+m*l; j+l<=slen; j +=l){tmp = hash[j-m*l] - hash[j-(m-1)*l]*nbase[l];mp[tmp]--;if (mp[tmp] == 0)mp.erase(tmp);tmp = hash[j] - hash[j+l]*nbase[l];mp[tmp]++;if (mp.size() == m)ans++;}}printf("%d\n", ans);}return 0;
}

hdu4821 字符串hash相关推荐

  1. hdu4821 字符串hash(有多少(M*L长的,M个不相同)子串))

    题意这英语..反正我是读不懂== 题意:给定一个串,有多少M*L的子串,其中子串的M个子串不相同= (注:某一位不相同即为不相同) 很明显要On的扫,但是似乎前一个与后一个没有关系?是的,前第x个(x ...

  2. 字符串Hash的原理与应用

    字符串Hash无论是在ACM竞赛中还是在工程中都有着广泛的应用,所以很有必要掌握好它的用法.主要分为两个部 分:Hash映射和冲突处理.而本文主要来详细讲解Hash映射的方法及应用,下篇文章将会介绍如 ...

  3. 字符串hash(二)

    从上一届已经讲了字符串hash的方法,hash后怎么用也很重要 文章目录 一.查询子串的hash值 查询子串减去期中一个字符后的hash值 查询两个子串拼接的hash值 **hash的模板(自然溢出) ...

  4. 字符串hash(一)

    很久没遇到过hash的题了,今天来重新温故一下 文章目录 序言 常用的几个字符串hash方法: hash公式(自然溢出) 讲解 模板 单hash 讲解 模板 双hash 讲解 代码 总结 序言 你有没 ...

  5. nssl1211-好文章【字符串hash,map】

    正题 题目大意 求长度为n个一个字符串长度为m不同的子串个数 解题思路 用字符串hash判断字符串是否相同,然后时间复杂度O(n2)O(n^2)O(n2),然后我们因为自然溢出所以不能开桶,那就开ma ...

  6. nssl1192-加密【字符串hash】

    正题 题目大意 对于每个字母都有一个加密后的字母对应. 然后给一段字母其中包括密文和密文对应的原文的一部分(也有可能没有原文),求一段最短的密文加原文. 解题思路 枚举密文和原文分界处.然后用字符串h ...

  7. UVA4671 K-neighbor substrings FFT+字符串hash

    题解: 将字符串A.B中的a和b分别以1和-1表示,对字符串B进行反转. 将A和B看成多项式,求卷积,这样的话从结果区间的[lenB−1,lenA)[lenB−1,lenA)[lenB-1,lenA) ...

  8. 【Codeforces - 127D】Password(思维,二分+字符串Hash)

    题干: Asterix, Obelix and their temporary buddies Suffix and Prefix has finally found the Harmony temp ...

  9. *【牛客 1 - A】矩阵(字符串hash)

    题干: 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每行 ...

最新文章

  1. Perfect World
  2. python螺旋圆的绘制_python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)...
  3. python教程循环语句_Python教程:关于Python 循环语句
  4. java 改变文件权限_Java文件权限
  5. 60.Linux/Unix 系统编程手册(下) -- SOCKET: 服务器设计
  6. arping 本机出现 timeout 问题
  7. 北斗卫星导航有哪些频段
  8. JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】
  9. 无需翻墙解决谷歌浏览器-谷歌翻译无法使用的解决方法
  10. 百宝云数组语法新手教程
  11. 《这本书能让你睡得好》 阅读笔记与思考
  12. 对于程序员来说什么才是A站B站。。。Z站?
  13. 电脑读卡器,电脑上如何找到读卡器
  14. 用python对excel进行打印操作
  15. Axure预览样式错误混乱
  16. 研究生发论文的流程?
  17. 2021年广西省安全员C证免费试题及广西省安全员C证考试试卷
  18. Java面试题有哪些
  19. office2016激活后还显示激活页面的解决办法
  20. Windows下Postgresql数据库的下载与配置

热门文章

  1. 中原银行数字化营销体系建设实践
  2. BFC与IFC概念理解+布局规则+形成方法+用处
  3. 《编程珠玑(第2版•修订版)》—第2章2.5节原理
  4. 【原创】MySQL5.7 虚拟列实现表达式索引
  5. Handlebars模板库浅析
  6. [C++] 井字棋游戏源码
  7. 【推荐】极简数独1.0源码
  8. 软件工程中的需求分析
  9. tip for interview
  10. eye caring sticker