Z函数(扩展 KMP)
简介对于个长度为 $n$ 的字符串 $s$。定义函数 $z[i]$ 表示 $s$ 和 $s[i,n-1]$(即以 $s[i]$ 开头的后缀)的最长公共前缀(LCP)的长度。$z$ 被称为 $s$ 的 Z 函数。特别地,$z[0] = 0$。
国外一般将计算该数组的算法称为 Z Algorithm,而国内则称其为 扩展 KMP。
示例下面若干样例展示了对于不同字符串的 Z 函数:
$z(\mathtt{aaaaa}) = [0, 4, 3, 2, 1]$
$z(\mathtt{aaabaab}) = [0, 2, 1, 0, 2, 1, 0]$
$z(\mathtt{abacaba}) = [0, 0, 1, 0, 3, 0, 1]$
朴素算法Z 函数的朴素算法复杂度为 $O(n^2)$:
1234567vector<int> z_function_trivial(string s) { int n = (int)s.length(); vector<int> z(n); for (int i = 1; i < n; ++i) wh ...
树状数组
关于一种简单的数据结构——树状数组。
KMP算法
关于一种简单的基础字符串匹配算法——KMP算法。
珂朵莉树
关于一种暴力数据结构——珂朵莉树!
关于筛法
关于筛法及其优化。
四边形不等式
关于四边形不等式。
ZROID18
生物必修一细胞呼吸与ATP,光合作用整理。
ZROID17
生物必修一细胞呼吸与ATP,光合作用整理。
ZROID19
生物必修一细胞呼吸与ATP,光合作用整理。
清北学堂牛杂
无向图连通分量边双连通分量
定义:一个极大子图,去掉任意一条边,变成不连通分量
缩点:树一条边只能属于一个边双连通分量点双连通分量
定义:一个极大子图,去掉任意一个点,变成不连通分量缩点:
(区别)一个点可以属于多个点双连通分量
手动开栈模拟DFS12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364#include <stdlib.h>#include <stdio.h>#define N 4 //定义图中点个数int a[N][N] = {{-1,1,1,-1},{1,-1,-1,1},{1,-1,-1,1},{-1,1,1,-1}}; //邻接矩阵,-1无边int label[N] = {0}; //标记数组,0未标记//定义栈及其方法struct Sta ...











