数据结构
字符串处理
KMP
1 | /* |
e-KMP
1 | /* |
Z-算法
1 | //求每个位置匹配前缀的长度的最大值 s[0…z[i]-1]=s[i…i+z[i]-1] |
最大最小表达式
1 | int getminmax(bool flag,string s){ |
Manacher
1 | char Ma[maxn*2]; |
Manacher返回最长回文串
1 | string Manacher(string s) { |
字符串哈希
1 | typedef unsigned long long ull; |
回文树
1 | const int MAXN = 100005 ; |
AC自动机
1 | struct Trie{ |
后缀数组
倍增法
1 | struct DA{ |
DC3
1 | struct DA{ |
树链剖分
1 | int n,q,a[maxn]; |
树分治
点分治
1 | int Laxt[maxn<<1],Next[maxn<<1],To[maxn<<1],Len[maxn<<1],ppp; |
可持续化字典树
1 | int sum[maxn * 35], son[maxn * 35][2],root[maxn]; |
主席树
1 | int sum[maxn*40],rt[maxn*40]; |
权值线段树
1 | ll sum[maxn*40],val[maxn*40]; |
图论
前向星
1 | int Next[maxn<<1],To[maxn<<1],Laxt[maxn<<1]; |
深度优先遍历相关
无向图的双连通分量
1 | struct Edge{ |
求无向图的桥和割点
1 |
|
有向图的强连通分量
1 | vector<int>G[maxn]; |
2-SAT匹配
1 | struct TwoSAT{ |
最短路
Dijkstra +单源最短路+记录路径O(mlogn)
1 | struct Edge{ |
BellmanFord (单源最短路判负环)O(nm)
1 | struct Edge |
Floyd 多源最短路 O(n^3)
1 | typedef struct{ |
Floyd 判环(龟兔赛跑算法)
1 | (1)求环 |
最小生成树
有向最小生成树(朱刘算法)
1 | /// 固定根的最小树型图,邻接矩阵写法 |
二分图
二分图判断
1 | color[maxn]; |
二分图最大基数匹配
1 | /// 二分图最大基数匹配 |
二分图最大权匹配(KM算法)
1 | int g[150][150]; ///存图 |
网络流
Edge
1 | struct Edge |
EdmondKarp
1 | const int maxn = "Edit"; |
Dinic
1 | const int maxn = "Edit"; |
ISAP
1 | const int maxn = "Edit"; |
MinCost MaxFlow
1 | const int maxn = "Edit"; |
LCA
倍增
1 | struct LCA{ |
倍增简单写法
1 | int mi[maxn][22],fa[maxn][22],dep[maxn]; |
数学
一些公式
1 | //平方和公式 sigm(i^2)=n*(n+1)*(2n+1)/6 |
莫比乌斯反演
组合数计数
1 | inv[0]=p[0]=1; |
卢卡斯定理
1 | ll pow_mod(ll x, ll n, ll mod){ |
逆元
如果mod不是素数 那么a关于mod的逆元是 a^(phi(mod)-1)
ExGcd求逆元
1 | ///返回 d=gcd(a,b); 和对应于等式 ax+by=d 中的 x,y |
费马小定理
1 | ///a<mod 并且 p为素数 |
逆元线性筛
1 | inv[1]=1; |
杜教筛
设需要计算的式子为:$\sum_{i=1}^{n}f(i)(f(i)为积性函数)$
我们构造两个积性函数$h$和$g$。使得$h=f∗g$
现在我们开始求$\sum_{i=1}^{n}h(i)$
记$S(n)=\sum_{i=1}^{n}f(i)$
$\sum_{i=1}^{n}h(i)=\sum_{i=1}^{n}\sum_{d|i}g(d)\cdot f(\frac{i}{d})\\\to =\sum_{d=1}^{n}g(d)\cdot\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f({i})$
$\to \sum_{i=1}^{n}h(i)=\sum_{d=1}^{n}g(d)\cdot S(\lfloor\frac{n}{d}\rfloor)$
接着,我们将右边式子的第一项给提出来,可以得到:
$\sum_{i=1}^{n}h(i)=g(1)\cdot S(n)+\sum_{d=2}^{n}g(d)\cdot S(\lfloor\frac{n}{d}\rfloor)$
$\to g(1)S(n)=\sum_{i=1}^{n}h(i)-\sum_{d=2}^{n}g(d)\cdot S(\lfloor\frac{n}{d}\rfloor) $
其中$h(i)=(f*g)(i)$
1 |
|
数论
合数分解
1 | int prime[maxn+1]; |
欧拉函数
欧拉降幂
A^Bmod C=A^(B mod phji(C)) %C gcd(a,c)==1
A^B mod C=A^B %C (B<phi(C))
A^B mod C=A^(B mod phi(C)+phi(C))%C (B>=phi(C))
得出单个数的欧拉函数 O(sqrt n)
1 | ll euler(ll n) |
筛法欧拉函数
1 | const int N = "Edit"; |
线性筛
1 | bool check[maxn]; |
莫比乌斯
莫比乌斯函数
1 | int prime[maxn]; |
模线性方程
中国剩余定理
1 | ///要求m 两两互质 X=ri(mod mi) 引用返回通解 X=re+k*mo |
ExCRT
1 | //mi可以不两两互质 |
大步小步算法 a^x=b(mod n)
1 | // 求解模方程a^x=b(mod n)。n 为素数。无解返回-1 |
扩展大步小步(gcd!=1)
1 | int ex_BSGS(int A,int B,int C) |
线性基
1 | struct Linear_Basis{ |
几何
弧度转换,点绕点旋转
其中顺时针旋转为负,逆时针旋转为正,角度angle是弧度值,如旋转30度转换为弧度为: $angle = pi/180 * 30$。
4、度与角度的转换
根据圆为$360 º$,弧度为$2π$,即 $360º = 2π$
4.1 角度转弧度:$2π / 360 = π / 180 ≈ 0.0174rad$, 即: $度数 (π / 180) = 弧度$
例如:将30º转为弧度rad
$ 30º (π / 180)= 0.523320 rad $
4.2 弧度转角度: $360 / 2π = 180 / π ≈ 57.3º$, 即: $ 弧度 (180 / π) = 度数$
例如:将$0.523320rad$转为度º
$0.523320rad (180 / π) = 29.9992352688º $
若o不是原点,则可先将a点坐标转换为相对坐标计算,计算结果再加上o点坐标。
参与计算的a点坐标实际应为 a - 0,最终计算公式如下:
$b.x = ( a.x - o.x)cos(angle) - (a.y - o.y)sin(angle) + o.x$
$b.y = (a.x - o.x)sin(angle) + (a.y - o.y)cos(angle) + o.y$
付队模板
1 |
|
球体积交
1 |
|
其他
技巧
JAVA
1 | import java.math.BigDecimal; |
文件读入
1 | freopen("input.txt","r",stdin); |
扩栈
1 | // 解决爆栈问题 |
快速读入
1 | // 适用于正负整数 |
莫队算法
1 | // --- |
高精度
1 | // 加法 乘法 小于号 输出 |
矩阵
矩阵快速幂
1 | typedef vector<ll>vec; |
高斯消元
1 | void gauss() |
数位DP
1 | int num[20]; |