前言
本系列是我学习完大佬的方法后,为了蓝桥杯前几天可以快速过一遍所做,所以部分内容会很简洁。如果能够帮助到你,我也会很开心!!!
哈希
哈希函数的构造
void insert1(int x)
{
int k = (x % N + N) % N;
//接下来就是熟悉的插入操作
}
int insert2(int x)
{
int k = (x % N + N) % N;
while (h[k]!=NULL&& h[k]!= x)
{
k++;
if (k == N)
k= 0;//重新开始找没有被用的
}
return 0;
}
字符串哈希
可用题目:
判断两个字符串是否相等/查找某个字符串是否存在与字符串集合当中
初始化
for (int i = 0; i <= n; i++)
{
b[0] = 1;
b[i] = b[i - 1] * b;//预处理次方
h[i] = h[i - 1] * base + str[i];
}
计算哈希
ull gethash(int l, int r)//计算l~r的哈希值
{
return h[r]-h[l-1]*b[r-l+1]
}
kmp
//计算next数组
for (int i = 2; j = 0; i <= m; i++)
{
while (j && p[i] != p[i + 1]) j = next[j];
if (p[i] = p[j + 1]) j++;
next[i] = j;
}
for (int i = 0, j = 0; i <= n; i++)
{
while (j && s[i] != p[j + 1]) j = next[j];
if (s[i] = p[j + 1]) j++;
if(j==m)
{
//题目所要求的
}
}
其实匹配的和计算next数组的代码几乎差不多,(for循环那有点不同)可以记住计算next数组的时候,多加一句next[i]=j;
Manacher算法
用处:
求最长回文子串
统计回文子串的数量
(关于回文子串的可以想一下Manacher)
代码
for (int i = 0; i <= 2 * n + 1; i++)
{
p[i] = i < R ? min[R - i, p[2 * mid - i]] : 1;
//如果p[i]可以更大,就持续更新
while (s[i + p[i]] == s[i - p[i]]) p[i]++;
//如果此时i可以作为更好的mid
if (i + p[i] > R)
mid = i, r = i + p[i];
}