可算在学校大佬的带领下
正经学了点算法了
人的专注力不行啊我
24道题搞定了21,看其他的完成率,估计不行了
当然还是有些看了题解的。
写这个主要是为了总结一下板子,和思路吧,以后好直接抄,嘿嘿
KMP模板
next数组
next_[0] = -1;
int i = 0, j = -1;
while (i < e) {
//e字符串c1长度
if (j == -1 || c1[i] == c1[j]) {
i++;
j++;
next_[i] = j;
}
else
j = next_[j];
}
kmp的匹配过程
与求next数组有点大同小异
int i = 0;
int j = 0;
int sLen = strlen(s);
int pLen = strlen(p);
while (i < sLen && j < pLen)
{
//①如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++
if (j == -1 || s[i] == p[j])
{
i++;
j++;
}
else
{
//②如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]
//next[j]即为j所对应的next值
j = next[j];
}
}
马拉车模板
- 记得p数组开两倍大小
- 原数组/字符串要经过预处理
int cen = 0;//中心点
int r = 0;//最右端
int ans = -1, ans_i=0;//记录最大半径和对应的中心位置
for (int i = 1; i < len; i++) {
//i=0不进行计算
p[i] = r > i ? min(p[2 * cen - i], r - i) : 1;
while (s1[i + p[i]] == s1[i - p[i