Template
LCT
struct LCT {
int f[N], c[N][2], s[N], t[N];
#define f(x) f[x]
#define lc(x) c[x][0]
#define rc(x) c[x][1]
#define get(x) (c[f[x]][1] == x)
#define nt(x) (lc(f[x]) == x || rc(f[x]) == x)
void up(int x) {s[x] = s[lc(x)] ^ s[rc(x)] ^ v[x];}
void move(int x) {swap(lc(x), rc(x)), t[x] ^= 1;}
void dw(int x) {
if(t[x]) {
if(lc(x)) move(lc(x));
if(rc(x)) move(rc(x));
t[x] = 0;
}
}
void upd(int x) {
if(nt(x)) upd(f[x]);
dw(x);
}
void rot(int x) {
int y = f(x), z = f(y), k = get(x), w = c[x][!k];
if(nt(y)) c[z][get(y)] = x;
c[y][k] = w, c[x][!k] = y;
if(w) f(w) = y;
f(x) = z, f(y) = x;
up(y);
}
void splay(int x) {
upd(x);
for(; nt(x); rot(x)) if(nt(f(x)))
rot(get(f(x)) ^ get(x) ? x : f(x));
up(x);
}
void access(int x) {
for(int p=0; x; x=f(p=x))
splay(x), rc(x) = p, up(x);
}
void maker(int x) {
access(x), splay(x);
if(t[x]) t[x] = 0; else move(x);
}
int find(int x) {
access(x), splay(x);
while(lc(x)) dw(x), x = lc(x);
splay(x); return x;
}
void link(int x, int y) {
maker(x);
if(find(y) != x) f[x] = y;
}
void split(int x, int y) {
maker(x), access(y), splay(y);
}
void cut(int x, int y) {
split(x, y);
if(lc(y) != x || lc(x) != rc(x)) return;
f(x) = lc(y) = 0, up(y);
}
} lct;
KMP
struct KMP {
int d[N];
void Kmp(char *a, char *b) {
int i, j=0, n = strlen(a + 1), m = strlen(b + 1);
for(i=2; i<=m; i++) {
while(j && b[j+1] != b[i]) j = d[j];
if(b[j + 1] == b[i]) j++;
d[i] = j;
}
for(j=0,i=1; i<=n; i++) {
while(j && b[j+1] != a[i]) j = d[j];
if(b[j + 1] == a[i]) j++;
if(j == m) printf("%d\n", i - m + 1);
}
}
} kmp;
Manacher
struct manacher {
char s[N<<1];
int n = 0, ans = 0, r, p[N<<1];
void init(char *c) {
s[++n] = '#';
for(i=1; c[i]; i++) s[++n] = c[i], s[++n] = '#';
s[++n] = '>';
for(i=2; i<n; i++) {
p[i] = i < r ? min(r - i, p[m * 2 - i]) : 1;
while(s[i - p[i]] == s[i + p[i]]) p[i]++;
if(i + p[i] > r) r = i + p[i], m = i;
ans = max(ans, p[i]);
}
}
} M;
笛卡尔树
struct Treap {
int lc[N], rc[N], st[N];
void init(int *a) {
int i, t = 0, k;
for(i=1; i<=n; i++) {
k = t;
while(k && a[st[k]] > a[i]) k--;
if(k) rc[st[k]] = i;
if(k ^ t) lc[i] = st[k + 1];
st[t=++k] = i;
}
}
} T;
康拓展开
struct Cantor {
int ans = 1, f[N];
void init(int *a, int n) {
int i;
for(f[0]=i=1; i<N; i++) f[i] = 1ll * f[i-1] * i % M;
for(i=1; i<=n; i++) {
T.add(a[i], 1);
ans = (ans + 1ll * f[n - i] * (a[i] - T.ask(a[i])) % M) % M;
}
}
} cantor;
Flow
const int N = 5007, inf = (1<<31)-1;
struct Flow {
int E = 1, S, T, h[N], e[N], v[N];
queue<int> q;
struct Yoi {
int b, c, n;
} d[N << 1];
void add(int a, int b, int c) {
d[++E] = {b, c, h[a]}, e[a] = h[a] = E;
d[++E] = {a, 0, h[b]}, e[b] = h[b] = E;
}
int bfs() {
memset(v, 0, sizeof v);
v[S] = 1, q.push(S);
int a, b, i;
while(q.size()) {
a = q.front(), q.pop();
for(i=h[a]=e[a]; i; i=d[i].n) {
b = d[i].b;
if(!v[b] && d[i].c > 0) v[b] = v[a] + 1, q.push(b);
}
}
return v[T];
}
int dfs(int a, int w) {
if(a == T) return w;
int b, c, s = 0, k;
for(int&i=h[a]; i&&w; i=d[i].n) {
b = d[i].b, c = min(d[i].c, w);
if(c && v[b] == v[a] + 1) {
s += k = dfs(b, c), w -= k;
d[i].c -= k, d[i^1].c += k;
}
}
return s ? s : v[a] = 0;
}
ll dinic() {
ll res = 0;
while(bfs()) res += dfs(S, inf);
return res;
}
} F;