trick 及公式见博文!
模板
hash.py
import hashlib
import sys
import re
fname = sys.argv[1]
f = open(fname, encoding="utf8")
fout = open(fname+".hash", "w", encoding="utf8")
for i in f.readlines():
no_space = "".join(i.split())
no_comment = no_space.split("//")[0]
fout.write(f"{hashlib.sha256(no_comment.encode('utf8')).hexdigest()[:4]} | {i}")
f.close()
fout.close()
rho
a2f9 | #include <bits/stdc++.h>
790b | using namespace std;
8f5d | typedef long long ll;
c83f | typedef long double ld;
d9e4 | inline ll qmul(ll x, ll y, ll mod) {
942d | ll res = x * y - mod * ll((ld)x / mod * y);
00f3 | if (res < 0) return res + mod;
571b | if (res < mod) return res;
f26b | return res - mod;
d10b | }
a02e | inline ll qpow(ll x, ll y, ll mod) {
ebfd | ll res = 1;
4aed | while (y) {
3685 | if (y & 1) res = qmul(res, x, mod);
93b5 | x = qmul(x, x, mod), y >>= 1;
d10b | }
f4f0 | return res;
d10b | }
70a7 | inline bool ispri(ll x) {
6645 | if (x < 3) return x == 2;
a8d0 | ll y = x - 1, h = 0;
0745 | while (!(y & 1)) y >>= 1, h++;
4ea8 | for (ll i = 0; i < 8; i++) {
f9d5 | ll v = qpow(rand() % (x - 2) + 2, y, x), th = h;
6673 | if (v == 1) continue;
2c61 | while (th--) {
264a | if (v == x - 1) break;
c0ae | v = qmul(v, v, x);
d10b | }
ad3d | if (th == -1) return 0;
d10b | }
31a0 | return 1;
d10b | }
e3b0 |
6a7a | inline ll gcd(ll x, ll y) { return y ? gcd(y, x % y) : x; }
6c64 | inline ll f(ll x, ll c, ll mod) {
907f | ll res = qmul(x, x, mod) + c;
8daf | return res < mod ? res : res - mod;
d10b | }
e49c | inline ll rho(ll x) {
2940 | ll c = rand() % (x - 1), s = 0;
3eb2 | for (ll rg = 1;; rg <<= 1) {
df0b | ll t = s, v = 1;
0b97 | for (ll j = 1; j <= rg; j++) {
3e1a | s = f(s, c, x);
e364 | v = qmul(v, abs(s - t), x);
efe3 | if (j % 127 == 0) {
ccb1 | ll g = gcd(v, x);
c0a0 | if (g > 1) return g;
d10b | }
d10b | }
cdfc | ll g = gcd(s, x);
c0a0 | if (g > 1) return g;
d10b | }
d10b | }
7154 | inline void fact(ll x) {
206b | if (x == 1) return;
ebd4 | if (ispri(x)) {
1179 | printf("%lld ", x);
8bea | return;
d10b | }
f030 | ll p;
ac0b | do
7154 | p = rho(x);
3327 | while (p == x);
0841 | fact(x / p), fact(p);
d10b | }
80cc | int main(int cnt, char **va) {
e1a4 | srand(time(0));
9e5b | for (int i = 1; i < cnt; i++) {
824e | ll x;
9a36 | sscanf(va[i], "%lld", &x);
0376 | printf("%lld:", x);
105a | fact(x);
d728 | putchar('\n');
d10b | }
7145 | return 0;
d10b | }
kd
e3b0 | // P4148 简单题
a2f9 | #include <bits/stdc++.h>
fe2f | #define sq(x) (x) * (x)
790b | using namespace std;
2ae2 | const double rate = 0.75;
12cc | const int MXN = 2e5 + 5;
2ffd | struct p {
6764 | int x, y, v;
22e2 | } c[MXN];
80d4 | typedef int arrn[MXN];
6d44 | int rt, nodec, flatc;
993c | int n, ql, qr, qd, qu;
f8f8 | arrn ls, rs, L, R, D, U, dim, sz, sum, t;
8673 | inline void upd(int x, int y) {
1c83 | sz[x] += sz[y], sum[x] += sum[y];
949b | L[x] = min(L[x], L[y]);
d959 | R[x] = max(R[x], R[y]);
6e26 | D[x] = min(D[x], D[y]);
5624 | U[x] = max(U[x], U[y]);
d10b | }
cbc7 | inline void pushu(int p) {
2460 | sum[p] = c[p].v, sz[p] = 1;
e206 | L[p] = R[p] = c[p].x;
bf0e | D[p] = U[p] = c[p].y;
26b7 | if (ls[p]) upd(p, ls[p]);
de48 | if (rs[p]) upd(p, rs[p]);
d10b | }
e3b0 |
eb36 | inline bool cmpx(int x, int y) { return c[x].x < c[y].x; }
9ba8 | inline bool cmpy(int x, int y) { return c[x].y < c[y].y; }
4fe5 | inline int build(int l, int r) {
5895 | if (l > r) return 0;
1326 | double avx = 0, avy = 0, vax = 0, vay = 0;
064c | for (int i = l; i <= r; i++) avx += c[t[i]].x, avy += c[t[i]].y;
47ad | avx /= (r - l + 1), avy /= (r - l + 1);
1954 | for (int i = l; i <= r; i++) vax += sq(avx - c[t[i]].x), vay += sq(avy - c[t[i]].y);
e3b0 |
46a6 | int mid = (l + r) >> 1;
aaa5 | if (vax > vay)
b301 | dim[t[mid]] = 1, nth_element(t + l, t + mid, t + r + 1, cmpx);
7dd5 | else
cf75 | dim[t[mid]] = 0, nth_element(t + l, t + mid, t + r + 1, cmpy);
dcaf | ls[t[mid]] = build(l, mid - 1), rs[t[mid]] = build(mid + 1, r);
07d2 | return pushu(t[mid]), t[mid];
d10b | }
5c22 | inline void flat(int p) {
43d6 | if (!p) return;
9dea | flat(ls[p]);
aa5e | t[++flatc] = p;
539e | flat(rs[p]);
d10b | }
5f6f | inline void rebuild(int &p) {
ec7e | flatc = 0;
7b87 | flat(p);
4869 | p = build(1, flatc);
d10b | }
07ad | inline bool balance(int p) { return rate * sz[p] >= max(sz[ls[p]], sz[rs[p]]); }
5450 | inline void ins(int &p, int x) {
1ef4 | if (!p) {
7af4 | pushu(p = x);
8bea | return;
d10b | }
3470 | if (dim[p]) {
ae20 | if (c[x].x <= c[p].x)
1b8a | ins(ls[p], x);
7dd5 | else
ea82 | ins(rs[p], x);
282f | } else {
99cb | if (c[x].y <= c[p].y)
1b8a | ins(ls[p], x);
7dd5 | else
ea82 | ins(rs[p], x);
d10b | }
4497 | pushu(p);
493d | if (!balance(p)) rebuild(p);
d10b | }
e64d | inline int que(int p) {
8296 | if (!p || ql > R[p] || qr < L[p] || qd > U[p] || qu < D[p]) return 0;
c9a7 | if (ql <= L[p] && qr >= R[p] && qd <= D[p] && qu >= U[p]) return sum[p];
7c82 | int res = que(ls[p]) + que(rs[p]);
22d5 | if (ql <= c[p].x && qr >= c[p].x && qd <= c[p].y && qu >= c[p].y) res += c[p].v;
f4f0 | return res;
d10b | }
e3b0 |
565c | int main() {
e570 | scanf("%*d");
d89a | int last = 0, op;
cd1f | while (scanf("%d", &op) != EOF) {
4f83 | if (op == 1) {
f00b | ++nodec;
5b58 | scanf("%d%d%d", &c[nodec].x, &c[nodec].y, &c[nodec].v);
769f | c[nodec].x ^= last, c[nodec].y ^= last, c[nodec].v ^= last;
087b | ins(rt, nodec);
86e4 | } else if (op == 2) {
fb7e | scanf("%d%d%d%d", &ql, &qd, &qr, &qu);
3f8b | ql ^= last, qr ^= last, qu ^= last, qd ^= last;
e467 | printf("%d\n", last = que(rt));
7a6d | } else
42af | break;
d10b | }
7145 | return 0;
d10b | }
dinic
a2f9 | #include <bits/stdc++.h>
e3b0 |
790b | using namespace std;
e3b0 |
e3b0 | // 原始版费用流
6798 | template <const int MXN, typename T = int>
f3fa | struct raw_flow {
bb6d | const T INF = numeric_limits<T>::max();
e67e | struct edge {
8664 | int v, o;
9095 | T c, w;
e9e5 | edge(int _v, T _c, T _w, int _o) : v(_v), o(_o), c(_c), w(_w) {}
df39 | };
9054 | vector<edge> g[MXN];
c98c | queue<int> q;
98f2 | int s, t, cure[MXN];
c1dd | bool vis[MXN];
962d | T dis[MXN];
2034 | void addedge(int u, int v, T c, T w) {
8c8d | g[u].push_back(edge(v, c, w, g[v].size()));
ecbb | g[v].push_back(edge(u, 0, -w, g[u].size() - 1));
d10b | }
fa43 | void adduedge(int u, int v, T c) {
c26d | g[u].push_back(edge(v, c, 1, g[v].size()));
9aab | g[v].push_back(edge(u, 0, 1, g[u].size() - 1));
d10b | }
f933 | bool spfa() {
0050 | for (int i = 0; i < MXN; i++) dis[i] = INF, cure[i] = 0;
94f2 | dis[s] = 0;
dc94 | q.push(s);
e1b4 | while (!q.empty()) {
2abc | int p = q.front();
d22c | q.pop();
b5f3 | vis[p] = 0;
99eb | for (edge &nx : g[p])
2b43 | if (nx.c && dis[nx.v] > dis[p] + nx.w) {
a54f | dis[nx.v] = dis[p] + nx.w;
c0e0 | if (!vis[nx.v]) {
a7bf | vis[nx.v] = 1;
538e | q.push(nx.v);
d10b | }
d10b | }
d10b | }
3e48 | return dis[t] != INF;
d10b | }
2403 | T dinic(int p, T fi) {
b642 | if (p == t) return fi;
e49f | T fo = 0;
82e7 | vis[p] = 1;
c2d6 | for (int &i = cure[p]; i < (int)g[p].size(); i++) {
ba9a | edge &nx = g[p][i];
a132 | if (dis[nx.v] == dis[p] + nx.w && !vis[nx.v] && nx.c) {
eb12 | T delt = dinic(nx.v, min(fi - fo, nx.c));
7238 | if (delt) {
f447 | nx.c -= delt;
2350 | g[nx.v][nx.o].c += delt;
991d | fo += delt;
435a | if (fi == fo) return vis[p] = 0, fo;
7a6d | } else
b122 | dis[nx.v] = -1;
d10b | }
d10b | }
42e1 | return vis[p] = 0, fo;
d10b | }
a3a8 | pair<T, T> run(int _s, int _t) {
a55e | s = _s, t = _t;
9a6a | pair<T, T> res = {0, 0};
9976 | while (spfa()) {
85de | T delt = dinic(s, INF);
3b0b | res.first += delt, res.second += delt * dis[t];
d10b | }
f4f0 | return res;
d10b | }
df39 | };
e3b0 | // 封装的上下界网络流
6798 | template <const int MXN, typename T = int>
0749 | struct lim_flow {
bb6d | const T INF = numeric_limits<T>::max();
f04e | raw_flow<MXN, T> f;
0fa7 | T deg[MXN];
038f | pair<T, T> res;
e3b0 | // 加边函数 起点 终点 流量下界 流量上界 [是否有负环=false]
9676 | void addedge(int u, int v, T l, T r, T w, bool cycle = 0) {
adf5 | if (cycle && w < 0) {
aece | w = -w;
abe1 | swap(v, u), swap(l, r);
7de1 | l = -l, r = -r;
d10b | }
16f2 | deg[u] -= l, deg[v] += l;
bb12 | res.second += l * w;
fd82 | f.addedge(u, v, r - l, w);
d10b | }
e3b0 | // 加单位边的函数(只求最大流,不求费用的时候用这个加边,跑的比较快)
5d87 | void adduedge(int u, int v, T l, T r) {
16f2 | deg[u] -= l, deg[v] += l;
bfc9 | f.adduedge(u, v, r - l);
d10b | }
e3b0 | // 超级源点 超级汇点 源点 汇点 [选项=1]
e3b0 | // 选项:
e3b0 | // 0->最小费用可行流
e3b0 | // 1->最小费用最大流
e3b0 | // 2->最小费用最小流
e3b0 | // 返回值 {流量,费用} 如果没有可行流返回 {-1,-1}
fa21 | pair<T, T> run(int super_s, int super_t, int s, int t, int opt = 1) {
57a0 | T all = 0;
cd9d | for (int i = 0; i < MXN; i++) {
a95e | if (deg[i] > 0)
06da | f.addedge(super_s, i, deg[i], 0), all += deg[i];
4ee7 | else if (deg[i] < 0)
d229 | f.addedge(i, super_t, -deg[i], 0);
d10b | }
b5fc | f.addedge(t, s, INF, 0);
c60e | pair<T, T> tres = f.run(super_s, super_t);
3e6d | if (tres.first != all) return {-1, -1};
ad9b | res.second += tres.second;
6759 | res.first += f.g[s].back().c;
f867 | f.g[s].back().c = 0;
d30e | f.g[t].back().c = 0;
1f71 | if (opt == 1) {
0911 | tres = f.run(s, t);
18a1 | res.first += tres.first, res.second += tres.second;
9551 | } else if (opt == 2) {
1696 | tres = f.run(t, s);
cb3e | res.first -= tres.first, res.second += tres.second;
d10b | }
f4f0 | return res;
d10b | }
df39 | };
e3b0 |
565c | int main() {
7145 | return 0;
d10b | }
sa
a2f9 | #include <bits/stdc++.h>
790b | using namespace std;
4aeb | const int MXN = 2e5 + 5, LG = 31 - __builtin_clz(MXN);
4c1c | int t, n, tot;
2d9a | char str[MXN];
e3b0 |
87fe | namespace SA {
80d4 | typedef int arrn[MXN];
614b | arrn sa, rk, tmp, ork, cnt;
69ad | int h[LG + 1][MXN];
275e | inline bool cmp(int x, int y, int w) { return ork[x] == ork[y] && ork[x + w] == ork[y + w]; }
2c45 | template <typename T>
bad5 | inline void init(int n, int m, T *arr) {
d837 | for (int i = 1; i <= m; i++) cnt[i] = 0;
d916 | for (int i = 1; i <= n; i++) cnt[rk[i] = arr[i]]++;
85ac | for (int i = 1; i <= m; i++) cnt[i] += cnt[i - 1];
305b | for (int i = n; i; i--) sa[cnt[rk[i]]--] = i;
0922 | for (int w = 1; w <= n; w <<= 1) {
a7ee | int ind = 0;
c7a8 | for (int i = n - w + 1; i <= n; i++) tmp[++ind] = i;
fd5c | for (int i = 1; i <= n; i++)
c2c2 | if (sa[i] > w) tmp[++ind] = sa[i] - w;
d837 | for (int i = 1; i <= m; i++) cnt[i] = 0;
1df0 | for (int i = 1; i <= n; i++) cnt[rk[i]]++;
85ac | for (int i = 1; i <= m; i++) cnt[i] += cnt[i - 1];
5061 | for (int i = n; i; i--) sa[cnt[rk[tmp[i]]]--] = tmp[i], ork[i] = rk[i];
7b65 | m = 0;
5aea | for (int i = 1; i <= n; i++) rk[sa[i]] = cmp(sa[i], sa[i - 1], w) ? m : ++m;
e453 | if (m == n) break;
d10b | }
e3b0 |
d835 | arr[n + 1] = -1;
0bb4 | for (int i = 1, lcp = 0; i <= n; i++) {
4869 | lcp -= !!lcp;
95ab | while (arr[i + lcp] == arr[sa[rk[i] - 1] + lcp]) ++lcp;
c363 | h[0][rk[i]] = lcp;
d10b | }
aad6 | for (int i = 1; i <= LG; i++)
7cac | for (int w = 1 << (i - 1), j = n - (1 << i) + 1; j > 0; j--) h[i][j] = min(h[i - 1][j], h[i - 1][j + w]);
d10b | }
4a44 | inline int lcp(int x, int y) {
5069 | x = rk[x], y = rk[y];
f144 | assert(x != y);
0c62 | if (x > y) swap(x, y);
557a | ++x;
1062 | int lg = 31 - __builtin_clz(y - x + 1);
7eb9 | return min(h[lg][x], h[lg][y - (1 << lg) + 1]);
d10b | }
d10b | } // namespace SA
e3b0 |
565c | int main() {
2bf3 | scanf("%d", &t);
73d1 | while (t--) {
33c4 | scanf("%d", &n);
8a9b | tot = n * 2 + 2;
5c1f | for (int i = 1; i <= n; i++) {
31e3 | char x;
ac0b | do
82c1 | x = getchar();
18ee | while (x != 'a' && x != 'b');
adf6 | str[i] = str[tot - i] = x;
d10b | }
bdde | str[n + 1] = '#';
8ec9 | str[tot] = 0;
abe0 | SA::init(tot - 1, 130, str);
83bd | int ans = 0;
fd5c | for (int i = 1; i <= n; i++)
bac4 | for (int j = i << 1; j <= n; j += i)
82a7 | ans = max(ans, (SA::lcp(tot - j, tot - j + i) + SA::lcp(j, j - i) + i - 1) / i);
d054 | printf("%d\n", ans);
d10b | }
7145 | return 0;
d10b | }
点方树
a2f9 | #include <bits/stdc++.h>
790b | using namespace std;
8f5d | typedef long long ll;
4f5e | const ll MXN = 3e5 + 5;
2451 | ll n, m;
07fb | vector<ll> g[MXN], t[MXN];
c5bc | void ae(vector<ll> *_g, ll u, ll v) {
2a3c | _g[u].push_back(v);
6205 | _g[v].push_back(u);
d10b | }
ffa6 | ll dfn[MXN], low[MXN], dfnc, sqrc;
9f8f | stack<ll> stk;
ff72 | void tj(ll p) {
b613 | dfn[p] = low[p] = ++dfnc;
99c2 | stk.push(p);
5cea | for (ll nx : g[p]) {
fc99 | if (!dfn[nx]) {
9d42 | tj(nx);
5889 | low[p] = min(low[nx], low[p]);
351b | if (low[nx] == dfn[p]) {
824e | ll x;
42f1 | ++sqrc;
f774 | do {
1ff9 | x = stk.top();
383f | stk.pop();
8c49 | ae(t, x, sqrc);
bc7f | } while (x != nx);
6468 | ae(t, p, sqrc);
d10b | }
7a6d | } else
4cff | low[p] = min(low[p], dfn[nx]);
d10b | }
d10b | }
c1dd | bool vis[MXN];
eaca | ll sz[MXN], ans;
3163 | void dfssz(ll p, ll fa) {
eedd | sz[p] = p <= n;
2d9b | for (ll nx : t[p])
cccf | if (nx != fa) {
0337 | dfssz(nx, p);
37cc | sz[p] += sz[nx];
d10b | }
d10b | }
a8b3 | ll sqr(ll x) { return x * (x - 1); }
fca1 | void cal(ll p, ll fa, ll tot) {
82e7 | vis[p] = 1;
92f4 | ll curw = (p <= n ? -1 : t[p].size()), cnt = sqr(tot) - sqr(tot - sz[p]);
2d9b | for (ll nx : t[p])
cccf | if (nx != fa) {
82b3 | cnt -= sqr(sz[nx]);
759e | cal(nx, p, tot);
d10b | }
2369 | ans += cnt * curw;
d10b | }
565c | int main() {
2f87 | scanf("%lld%lld", &n, &m);
c8c0 | sqrc = n;
76d2 | while (m--) {
f6e3 | ll u, v;
d759 | scanf("%lld%lld", &u, &v);
e6c6 | ae(g, u, v);
d10b | }
029e | for (ll i = 1; i <= n; i++)
8944 | if (!dfn[i]) tj(i);
ee2c | for (ll i = 1; i <= sqrc; i++)
3f61 | if (!vis[i]) {
18f9 | dfssz(i, 0);
1d95 | cal(i, 0, sz[i]);
d10b | }
57e2 | printf("%lld", ans);
e3b0 |
7145 | return 0;
d10b | }
正常 tarjan
e3b0 | // P3387 【模板】缩点
a2f9 | #include <bits/stdc++.h>
790b | using namespace std;
0c05 | const int MXN = 1e4 + 5;
5a2b | vector<int> e[MXN], ne[MXN];
1328 | int n, m, arr[MXN], dp[MXN];
6809 | int col[MXN], tot[MXN], colc;
4b91 | int dfn[MXN], low[MXN], dfsc;
ac7d | bool instk[MXN];
1b0a | stack<int> st;
3377 | inline void tj(int p) {
1ac8 | dfn[p] = low[p] = ++dfsc;
80cd | st.push(p), instk[p] = 1;
5ea7 | for (int nx : e[p]) {
9c9c | if (!dfn[nx])
fb1e | tj(nx), low[p] = min(low[p], low[nx]);
11a6 | else if (instk[nx])
4cff | low[p] = min(low[p], dfn[nx]);
d10b | }
e3b0 |
a001 | if (dfn[p] == low[p]) {
6b91 | int x;
a707 | ++colc;
f774 | do {
54c8 | x = st.top();
3438 | st.pop();
e635 | col[x] = colc, instk[x] = 0;
b0f8 | tot[colc] += arr[x];
cf44 | } while (x != p);
d10b | }
d10b | }
4f94 | inline int dfs(int p) {
b492 | if (~dp[p]) return dp[p];
65a9 | dp[p] = tot[p];
4f59 | for (int nx : ne[p]) dp[p] = max(dp[p], dfs(nx) + tot[p]);
e767 | return dp[p];
d10b | }
e3b0 |
565c | int main() {
81dd | scanf("%d%d", &n, &m);
05f2 | for (int i = 1; i <= n; i++) scanf("%d", arr + i);
a6a1 | for (int i = 1, ts, tt; i <= m; i++) {
a58c | scanf("%d%d", &ts, &tt);
9446 | e[ts].push_back(tt);
d10b | }
fd5c | for (int i = 1; i <= n; i++)
8944 | if (!dfn[i]) tj(i);
fd5c | for (int i = 1; i <= n; i++)
fed9 | for (int nx : e[i])
fbba | if (col[nx] != col[i]) ne[col[nx]].push_back(col[i]);
55e8 | memset(dp, -1, sizeof(dp));
83bd | int ans = 0;
484b | for (int i = 1; i <= colc; i++) ans = max(ans, dfs(i));
35cb | printf("%d", ans);
7145 | return 0;
d10b | }