目录
字符串Hash入门
字符串Hash可以通俗的理解为,把一个字符串当中的每一个字符映射为一个整数。
如果我们通过某种方法,将字符串转换为一个整数,就可以便的确定某个字符串是否重复出现过,这是最简单的字符串Hash应用情景了。
哈希算法不等于哈希表!!!
一个疑问
对于该题,判断两个字串是否相等,为什么不能用头文件 <string> 当中的 substr(begin, pos)呢?这里就涉及到时间复杂度的问题:substr的时间复杂度为 O(n),n是查找字符串的长度,这是一个线性复杂度
substr 源码具体参考:(24条消息) subString源码分析_weixin_30765505的博客-CSDN博客
那么,这里就合理的引出了哈希算法,它对于查找子串操作的时间复杂度仅为 O(1)
Hash算法自然溢出模板
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
const int N = 1000010, base = 131;
ull h[N]; //h为字符串子串的前缀和
char s[N];
int main()
{
scanf("%s", s + 1); //从第1位开始录入数据方便计算
int len = strlen(s + 1);
p[0] = 1; //不是p[1] = 1,我们要使P[i] =