摘要:
强连通缩点: 算法复杂度: Kosaraju算法:初始化,加边,两次dfs,复杂度O(n+m) 强连通分量缩点算法:遍历每个点每条边,复杂度O(n+m) 对边排序去重:复杂度O(n+mlogm) 注意: 1、最好先 Init() ,然后再 AddEdge() 2、维护缩点时点的性质对新点的影响在 d 阅读全文
摘要:
有向图才会有forward edge和cross edge。无向图是没有这两种edge的。 void dfs(int u) { vis[u] = 1; for(int &v : G[u]) { switch(vis[v]) { case 0: // tree edge vis[v] = 1; dfs 阅读全文
摘要:
struct ACM { static const int MAXN = 1e6 + 10; int ch[MAXN][26], fail[MAXN]; int cnt; int R[MAXN]; void Init() { ms(ch[0]), fail[0] = 0; cnt = 0; } in 阅读全文
摘要:
https://oi-wiki.org/string/kmp/ 研究的对象其实主要是前缀函数,而不是KMP算法,KMP算法只是前缀函数的一个应用,如何求前缀函数,理解前缀函数的作用才是关键。 简单理解然后应用 前缀函数:对字符串s(从1开始)求其前缀函数pi,则pi[i]表示长度为i的s的前缀s[1 阅读全文
摘要:
struct PAM { static const int MAXN = 1e6 + 10; char s[MAXN]; int ch[MAXN][26], len[MAXN], fail[MAXN], dep[MAXN]; int cnt, slen, lst; int R[MAXN]; void 阅读全文
摘要:
根据不同的需求要改的太多了,注意如果不需要防hack可以关闭anti_hack,或者在多个字符串共享同一个哈希算法的时候让anti_hack值 哈希值为64位有符号整数 进行2次哈希,输出为long long的版本。 基本上只维护这个版本了,不太想维护其他版本的。 字符串的多项式哈希的公式 \[ha 阅读全文
摘要:
适用于非负权图,所有的边权都是非负数。 或者从s节点出发的子图中,边权都是非负数的也可以。(从s出发没办法适用的,是负数甚至复数都无所谓。) Dijkstra算法 标准版本,带有vis数组方便检查是否从s出发可以到达i。 下面的版本中是从1开始的n个点。如果是从0开始的话要改一下。 namespac 阅读全文
摘要:
验证链接:洛谷P5656 | 洛谷P1082 | 洛谷P3811 LCE1这个算法找到的是x的最小非负整数解。剩下的事情交给倍增算法。 注意特判0和负数的情况,下面存在除以0的时候。假如传入的数字有负数,则返回值需要特殊处理。 namespace exGCD { ll exgcd(ll a, ll 阅读全文
摘要:
中国剩余定理 一元线性同余方程组 $ x\equiv r_1 (\mod m_1)\ x\equiv r_2 (\mod m_2)\ x\equiv r_3 (\mod m_3)\ ...\ x\equiv r_n (\mod m_n)\ $ 其中,对于任意的 \(i\neq j\) , \(gcd 阅读全文
摘要:
namespace SegmentTree { #define ls (o << 1) #define rs (o << 1 | 1) ll bse[3] = {13, 1331, 2333}; ll mod[3] = {998244353, 1000000007, 1000000009}; ll 阅读全文