Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 0 additions & 38 deletions .verify-helper/timestamps.remote.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,6 @@
"tests/library_checker_aizu_tests/flow/dinic_lib_checker.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/flow/hungarian.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/flow/min_cost_max_flow.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/graphs/biconnected_components.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/connected_components_of_complement_graph.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/dijkstra_aizu.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/dijkstra_lib_checker.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/directed_cycle.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/enumerate_triangles.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/graphs/hopcroft_karp_aizu.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/hopcroft_karp_lib_checker.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/mst.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/graphs/offline_incremental_scc.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/graphs/strongly_connected_components_aizu.test.cpp": "2024-12-14 15:47:13 -0600",
Expand All @@ -68,18 +60,10 @@
"tests/library_checker_aizu_tests/handmade_tests/edge_cd_small_trees.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/handmade_tests/fib_matrix_expo.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/handmade_tests/functional_graph.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/handmade_tests/lca_ladder_forest.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/handmade_tests/manacher.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/handmade_tests/merge_st_and_wavelet.test.cpp": "2024-11-19 08:31:51 -0600",
"tests/library_checker_aizu_tests/handmade_tests/mobius.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/handmade_tests/mod_int.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/handmade_tests/n_choose_k.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/handmade_tests/permutation_tree_small.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/handmade_tests/rmq_small_n.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/handmade_tests/sa_find_subarray.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/handmade_tests/seg_tree_find.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/handmade_tests/seg_tree_find_small.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/handmade_tests/string_with_vector.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/loops/chooses.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/loops/quotients.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/loops/submasks.test.cpp": "2024-11-17 14:04:03 -0600",
Expand All @@ -101,28 +85,6 @@
"tests/library_checker_aizu_tests/math/solve_linear_mod.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/math/tetration.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/math/totient.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/math/xor_basis.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/math/xor_basis_intersection.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/monotonic_stack_related/cartesian_binary_tree.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/monotonic_stack_related/cartesian_k_ary_tree.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/monotonic_stack_related/count_rectangles.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/monotonic_stack_related/max_rect_histogram.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/kmp.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/strings/lcp_array.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/lcp_query_palindrome.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/lcp_query_zfunc.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/lcs_dp.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/strings/lcs_queries.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/strings/lcs_queries_merge_sort_tree.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/strings/longest_common_substring.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/manacher.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/strings/multi_matching_bs.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/prefix_function.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/strings/sa_cmp.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/sa_sort_pairs.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/suffix_array.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp": "2024-12-14 15:47:13 -0600",
"tests/library_checker_aizu_tests/strings/trie.test.cpp": "2024-12-05 10:41:42 -0600",
"tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp": "2024-11-17 14:04:03 -0600",
"tests/library_checker_aizu_tests/trees/cd_jump_on_tree.test.cpp": "2024-12-14 15:47:13 -0600",
Expand Down
8 changes: 6 additions & 2 deletions library/graphs/bridges_cuts/block_vertex_tree.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
//! vector<vector<pii>> adj(n);
//! cuts cc(adj, m);
//! vector<vi> bvt = block_vertex_tree(adj, cc);
//! vector<basic_string<array<int, 2>>> adj1(n);
//! cuts cc1(adj1, m);
//! vector<vi> bvt1 = block_vertex_tree(adj1, cc1);
//! //to loop over each unique bcc containing a node u:
//! for (int bccid : bvt[v]) {
//! bccid -= n;
Expand All @@ -15,8 +18,9 @@
//! [n, n + num_bccs) are BCC nodes
//! @time O(n + m)
//! @time O(n)
vector<vi> block_vertex_tree(
const vector<vector<pii>>& adj, const cuts& cc) {
template<class G>
vector<vi> block_vertex_tree(const G& adj,
const cuts<G>& cc) {
int n = sz(adj);
vector<vi> bvt(n + cc.num_bccs);
vector<bool> vis(cc.num_bccs);
Expand Down
8 changes: 6 additions & 2 deletions library/graphs/bridges_cuts/bridge_tree.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
//! vector<vector<pii>> adj(n);
//! bridges br(adj, m);
//! vector<vi> bt = bridge_tree(adj, br);
//! vector<basic_string<array<int, 2>>> adj1(n);
//! bridges br1(adj1, m);
//! vector<vi> bt1 = bridge_tree(adj1, br1);
//! @endcode
//! @time O(n + m)
//! @space O(n)
vector<vi> bridge_tree(const vector<vector<pii>>& adj,
const bridges& br) {
template<class G>
vector<vi> bridge_tree(const G& adj,
const bridges<G>& br) {
vector<vi> tree(br.num_ccs);
rep(i, 0, sz(adj)) for (auto [u, e_id] : adj[i]) if (
br.is_bridge[e_id]) tree[br.br_id[i]]
Expand Down
7 changes: 5 additions & 2 deletions library/graphs/bridges_cuts/bridges.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,19 @@
//! adj[v].emplace_back(u, i);
//! }
//! auto [num_ccs, is_bridge, br_id] = bridges(adj, m);
//! vector<basic_string<array<int,2>>> adj1(n);
//! auto [num_ccs1, is_bridge1, br_id1] = bridges(adj1,
//! m);
//! @endcode
//! is_bridge[edge id] = 1 iff bridge edge
//! br_id[v] = id, 0<=id<num_ccs
//! @time O(n + m)
//! @space O(n + m)
struct bridges {
template<class G> struct bridges {
int num_ccs = 0;
vector<bool> is_bridge;
vi br_id;
bridges(const vector<vector<pii>>& adj, int m):
bridges(const G& adj, int m):
is_bridge(m), br_id(sz(adj), -1) {
int n = sz(adj), timer = 1;
vi tin(n), st;
Expand Down
6 changes: 4 additions & 2 deletions library/graphs/bridges_cuts/cuts.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,18 @@
//! adj[v].emplace_back(u, i);
//! }
//! auto [num_bccs, is_cut, bcc_id] = cuts(adj, m);
//! vector<basic_string<array<int,2>>> adj1(n);
//! auto [num_bccs1, is_cut1, bcc_id1] = cuts(adj1, m);
//! @endcode
//! is_cut[v] = 1 iff cut node
//! bcc_id[edge id] = id, 0<=id<num_bccs
//! @time O(n + m)
//! @space O(n + m)
struct cuts {
template<class G> struct cuts {
int num_bccs = 0;
vector<bool> is_cut;
vi bcc_id;
cuts(const vector<vector<pii>>& adj, int m):
cuts(const G& adj, int m):
is_cut(sz(adj)), bcc_id(m, -1) {
int n = sz(adj), timer = 1;
vi tin(n), st;
Expand Down
7 changes: 5 additions & 2 deletions library/graphs/complement_graph_ccs.hpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,18 @@
#pragma once
//! @code
//! vector<vi> adj(n);
//! auto cc_id = get_complement_graph_ccs(adj);
//! vi cc_id = get_complement_graph_ccs(adj);
//! vector<basic_string<int>> adj1;
//! vi cc_id2 = get_complement_graph_ccs(adj1);
//! @endcode
//! 0<=cc_id[v]<number of connected components
//! in the complement graph
//! cc_id[u] == cc_id[v] if u,v are in the same
//! cc in the compliment graph
//! @time O(n + m)
//! @space O(n)
vi get_complement_graph_ccs(const vector<vi> &adj) {
template<class G>
vi get_complement_graph_ccs(const G& adj) {
int n = sz(adj);
vi cc_id(n), unseen(n);
iota(all(unseen), 0);
Expand Down
6 changes: 4 additions & 2 deletions library/graphs/dijkstra.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@
//! @code
//! vector<vector<pair<int, ll>>> adj(n);
//! auto d = dijkstra(adj, source);
//! vector<basic_string<array<int, 2>>> adj1(n);
//! auto d1 = dijkstra(adj1, source);
//! @endcode
//! d[v] = min dist from source->..->v
//! @time O(n + (m log m))
//! @space O(n + m)
vector<ll> dijkstra(
const vector<vector<pair<int, ll>>>& adj, int s) {
template<class G>
vector<ll> dijkstra(const G& adj, int s) {
using p = pair<ll, int>;
priority_queue<p, vector<p>, greater<>> pq;
pq.emplace(0, s);
Expand Down
6 changes: 4 additions & 2 deletions library/graphs/hopcroft_karp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
//! adj[l].push_back(r); // add edge l <-> r
//! auto [matching_size, to_r, to_l,
//! mvc_l, mvc_r] = hopcroft_karp(adj, rsz);
//! vector<basic_string<int>> adj1(lsz);
//! hopcroft_karp match(adj1, rsz);
//! @endcode
//! 0<=l<lsz; 0<=r<rsz
//! l <-> to_r[l] in matching if to_r[l]!=-1
Expand All @@ -13,11 +15,11 @@
//! mvc_r[r] is 1 if r in Min Vertex Cover
//! @time O(n + m * sqrt(n)) n = lsz + rsz
//! @space O(n)
struct hopcroft_karp {
template<class G> struct hopcroft_karp {
int m_sz = 0;
vi to_r, to_l;
vector<bool> mvc_l, mvc_r;
hopcroft_karp(const vector<vi>& adj, int rsz):
hopcroft_karp(const G& adj, int rsz):
to_r(sz(adj), -1), to_l(rsz, -1) {
int lsz = sz(adj);
while (1) {
Expand Down
6 changes: 4 additions & 2 deletions library/graphs/strongly_connected_components/scc.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,17 @@
//! @code
//! vector<vi> adj(n);
//! auto [num_sccs, scc_id] = sccs(adj);
//! vector<basic_string<int>> adj1(n);
//! auto [num_sccs1, scc_id1] = sccs(adj1);
//! @endcode
//! scc_id[v] = id, 0<=id<num_sccs
//! for each edge u -> v: scc_id[u] >= scc_id[v]
//! @time O(n + m)
//! @space O(n)
struct sccs {
template<class G> struct sccs {
int num_sccs = 0;
vi scc_id;
sccs(const vector<vi>& adj): scc_id(sz(adj), -1) {
sccs(const G& adj): scc_id(sz(adj), -1) {
int n = sz(adj), timer = 1;
vi tin(n), st;
auto dfs = [&](auto&& self, int v) -> int {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
#pragma once
#include "prefix_function.hpp"
//! @code
//! string s,t;
//! KMP kmp(t);
//! auto match = kmp.find_str(s);
//! vi s_vec,t_vec;
//! KMP kmp1(t_vec);
//! auto match2 = kmp1.find_str(s_vec);
//! @endcode
//! if match[i] == 1 then s[i,sz(t)) == t
//! @time O(|s| + |t|)
Expand Down
12 changes: 10 additions & 2 deletions library/strings/longest_common_subsequence/lcs_queries.hpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,16 @@
#pragma once
#include "../../data_structures/bit.hpp"
#include "lcs_dp.hpp"
//! Given tuples (s_r, t_le, t_ri), find:
//! size(LCS(s[0,s_r), t[t_le,t_ri)))
//! @code
//! string s,t;
//! vi lcs_len = lcs_queries(s, t, queries);
//! vi s_vec,t_vec;
//! vi lcs_len1 = lcs_queries(s_vec, t_vec, queries);
//! @endcode
//! lcs_len[i] = size(LCS(
//! s[0,queries[i][0]),
//! t[queries[i][1],queries[i][2])
//! ))
//! @time O(n*m*log(m) + q*log(m) + q*log(q))
//! @space O(n + m + q)
template<class T>
Expand Down
5 changes: 4 additions & 1 deletion library/strings/manacher/manacher.hpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
#pragma once
//! https://codeforces.com/blog/entry/12143#comment-324162
//! @code
//! string s;
//! auto man = manacher(s);
//! vi s_vec;
//! auto man1 = manacher(s_vec);
//! @endcode
//!
//! man[center] = index of start of longest
Expand All @@ -15,7 +18,7 @@
//! @space O(n)
template<class T> vi manacher(const T& s) {
int n = sz(s), p = 0;
vi man(max(0, 2 * n - 1));
vi man(2 * n - 1);
rep(i, 0, 2 * n - 1) {
int r = i <= 2 * (p - man[p])
? p - max(man[2 * p - i], man[p])
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once
#include "compare_suffixes.hpp"
//! @code
//! string s;
//! auto [sa, sa_inv, lcp] = get_sa(s, 256);
//! sa_query saq(s, sa, sa_inv, lcp);
//! int cmp = saq.cmp_substrs(l1,r1,l2,r2);
Expand Down
1 change: 1 addition & 0 deletions library/strings/suffix_array/compare/compare_suffixes.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
//! @code
//! string s;
//! auto [sa, sa_inv, lcp] = get_sa(s, 256);
//! sa_query saq(s, sa, sa_inv, lcp);
//! int cmp = saq.cmp_sufs(l1,l2);
Expand Down
1 change: 1 addition & 0 deletions library/strings/suffix_array/find/find_substring.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once
//! @code
//! string s;
//! auto [sa, sa_inv, lcp] = get_sa(s, 256);
//! sa_query saq(s, sa, sa_inv, lcp);
//! auto [sa_le,sa_ri] = saq.find_substr(s_l,s_r);
Expand Down
6 changes: 4 additions & 2 deletions library/strings/suffix_array/suffix_array.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
//! lcp = {1, 3, 0, 0, 2}
//!
//! @code
//! // requires 0<=s[i]<max_num
//! string s;
//! auto [sa, sa_inv, lcp] = get_sa(s, 256);
//! vi s_vec;
//! auto [sa1, sa_inv1, lcp1] = get_sa(s_vec, 100'001);
//! @endcode
//!
//! requires 0<=s[i]<max_num
//!
//! @time O(nlogn + max_num)
//! @space O(n + max_num)
template<class T>
Expand Down
5 changes: 4 additions & 1 deletion library/strings/suffix_array/suffix_array_query.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,12 @@
#include "../../data_structures/rmq.hpp"
#include "find/match.hpp"
//! @code
//! //or sa_short
//! string s;
//! auto [sa, sa_inv, lcp] = get_sa(s, 256);
//! sa_query saq(s, sa, sa_inv, lcp);
//! vi s_vec;
//! auto [sa1, sa_inv1, lcp1] = sa_short(s_vec);
//! sa_query saq1(s_vec, sa1, sa_inv1, lcp1);
//! @endcode
template<class T> struct sa_query {
int n;
Expand Down
3 changes: 3 additions & 0 deletions library/strings/suffix_array/suffix_array_short.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@
//! https://github.com/atcoder/ac-library/blob/master/atcoder/string.hpp
//! @code
//! // requires s[i]>=0
//! string s;
//! auto [sa, sa_inv, lcp] = sa_short(s);
//! vi s_vec;
//! auto [sa1, sa_inv1, lcp1] = sa_short(s_vec);
//! @endcode
//! runs in ~1.5s for 5e5
//! @time O(n * log^2(n))
Expand Down
1 change: 1 addition & 0 deletions library/strings/wildcard_pattern_matching.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once
//! https://codeforces.com/blog/entry/111380
//! @code
//! vl s_vec, t_vec;
//! auto mtch = wildcard_pattern_matching(
//! s_vec, t_vec, conv);
//! @endcode
Expand Down
10 changes: 7 additions & 3 deletions library/trees/centroid_decomp.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@
//! centroid(adj, [&](const vector<vi>& adj,
//! int cent, int par_cent) {
//! });
//! vector<basic_string<int>> adj1(n);
//! centroid(adj1,
//! [&](const vector<basic_string<int>>& adj1,
//! int cent, int par_cent) {});
//! @endcode
//! @time O(n log n)
//! @space O(n)
template<class F> struct centroid {
vector<vi> adj;
template<class F, class G> struct centroid {
G adj;
F f;
vi siz;
centroid(const vector<vi>& adj, F f):
centroid(const G& adj, F f):
adj(adj), f(f), siz(sz(adj), -1) {
rep(i, 0, sz(adj)) if (siz[i] == -1) dfs(i, -1);
}
Expand Down
Loading
Loading