只比哈希会挑出几个位置

把一段字符折成一个数:h = (h × 31 + 字母序号) % 17,a 记 1、b 记 2、c 记 3。 只比哈希值、不做逐字符确认,数一数会挑出多少个位置: #include <iostream> #include <

开始练习 →

把每个窗口的哈希算出来

把一段字符折成一个数:h = (h × 31 + 字母序号) % 17,a 记 1、b 记 2、c 记 3。 补全 roll_all,输出哈希值和模式相同的那些位置。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

加上确认这一步五个变三个

把一段字符折成一个数:h = (h × 31 + 字母序号) % 17,a 记 1、b 记 2、c 记 3。 补上逐字符确认那一步,输出「只比哈希挑出几个」和「确认之后剩几个」。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

把假阳性揪出来

把一段字符折成一个数:h = (h × 31 + 字母序号) % 17,a 记 1、b 记 2、c 记 3。 找出那些哈希对上了、字符却不一样的位置,用 / 连起来输出。 (本题用 g++ -std=c++17 -O0 编译。)

开始练习 →

无符号数溢出以后等于什么

第 1 步:H[i] 是前 i 个字的哈希 第 2 步:每往后一格:乘 B 再加一个字 第 3 步:要子串 [2, 5):看 H2 和 H5 第 4 步:H2 先乘 B³,挪到同一位上 第 5 步:H5 减它,剩下的就是子串 H0 H1 H

开始练习 →

为什么用无符号数做自然溢出

自然溢出哈希要用 unsigned long long,不能用有符号的,是因为【0】。

开始练习 →

自然溢出哈希为什么会被卡

自然溢出哈希在竞赛里有时会被特殊数据卡掉,原因是【0】。

开始练习 →

零减一变成了多少

运行下面这段程序: #include <iostream> #include <string> #include <vector> using namespace std; int main() {

开始练习 →

两段子串的哈希相等吗

用 unsigned long long 做前缀哈希:h[i+1] = h[i] × B + 字母序号(a 记 1),不取模,让它自然溢出。 运行下面这段程序: #include <iostream> #include <

开始练习 →

补全前缀哈希

用 unsigned long long 做前缀哈希:h[i+1] = h[i] × B + 字母序号(a 记 1),不取模,让它自然溢出。 补全前缀哈希的递推,输出字符串 abc 的整体哈希 h[3](B = 131)。 (本题用 g++

开始练习 →