From 95a134af1a240ceb49ea0611204d91d5f9cd7ae8 Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Tue, 5 Aug 2025 17:14:25 -0600 Subject: [PATCH 1/2] test with vector instead of string because s[s.size()] is **not** UB --- library/strings/wildcard_pattern_matching.hpp | 1 + .../library_checker_aizu_tests/strings/kmp.test.cpp | 4 ++-- .../strings/lcp_array.test.cpp | 4 ++-- .../strings/lcp_query_palindrome.test.cpp | 4 ++-- .../strings/lcp_query_zfunc.test.cpp | 4 ++-- .../strings/lcs_dp.test.cpp | 2 +- .../strings/lcs_queries.test.cpp | 3 ++- .../strings/lcs_queries_merge_sort_tree.test.cpp | 2 +- .../strings/manacher.test.cpp | 2 +- .../strings/multi_matching_bs.test.cpp | 13 +++++++------ .../strings/prefix_function.test.cpp | 2 +- .../strings/single_matching_bs.test.cpp | 11 ++++++----- .../strings/suffix_array.test.cpp | 6 +++--- .../strings/suffix_array_short.test.cpp | 2 +- .../strings/wildcard_pattern_matching.test.cpp | 1 - 15 files changed, 32 insertions(+), 29 deletions(-) diff --git a/library/strings/wildcard_pattern_matching.hpp b/library/strings/wildcard_pattern_matching.hpp index acb05138..4bc4f31d 100644 --- a/library/strings/wildcard_pattern_matching.hpp +++ b/library/strings/wildcard_pattern_matching.hpp @@ -9,6 +9,7 @@ //! s_vec[i]=0 or t_vec[i]=0 for a wildcard //! @time O((n+m) log (n+m)) //! @space O(n+m) +using vl = vector; vector make_powers(const vl& v) { int n = sz(v); vector pws(3, vl(n)); diff --git a/tests/library_checker_aizu_tests/strings/kmp.test.cpp b/tests/library_checker_aizu_tests/strings/kmp.test.cpp index 59e49afe..d6101e78 100644 --- a/tests/library_checker_aizu_tests/strings/kmp.test.cpp +++ b/tests/library_checker_aizu_tests/strings/kmp.test.cpp @@ -6,8 +6,8 @@ int main() { cin.tie(0)->sync_with_stdio(0); string haystack, needle; cin >> haystack >> needle; - KMP kmp(needle); - vector is_m = kmp.find_str(haystack); + KMP kmp(vi(all(needle))); + vector is_m = kmp.find_str(vi(all(haystack))); for (int i = 0; i < sz(is_m); i++) if (is_m[i]) cout << i << '\n'; return 0; diff --git a/tests/library_checker_aizu_tests/strings/lcp_array.test.cpp b/tests/library_checker_aizu_tests/strings/lcp_array.test.cpp index 66bd3022..9e0d7ff7 100644 --- a/tests/library_checker_aizu_tests/strings/lcp_array.test.cpp +++ b/tests/library_checker_aizu_tests/strings/lcp_array.test.cpp @@ -19,8 +19,8 @@ int main() { string s; cin >> s; int n = sz(s); - auto [sa, sa_inv, lcp] = get_sa(s, 256); - auto [sa1, sa_inv1, lcp1] = sa_short(s); + auto [sa, sa_inv, lcp] = get_sa(vi(all(s)), 256); + auto [sa1, sa_inv1, lcp1] = sa_short(vi(all(s))); assert(sa == sa1); assert(sa_inv == sa_inv1); assert(lcp == lcp1); diff --git a/tests/library_checker_aizu_tests/strings/lcp_query_palindrome.test.cpp b/tests/library_checker_aizu_tests/strings/lcp_query_palindrome.test.cpp index 46479287..cd8428a8 100644 --- a/tests/library_checker_aizu_tests/strings/lcp_query_palindrome.test.cpp +++ b/tests/library_checker_aizu_tests/strings/lcp_query_palindrome.test.cpp @@ -8,8 +8,8 @@ int main() { cin >> s; int n = sz(s); s = s + '$' + string(rbegin(s), rend(s)); - auto [sa, sa_inv, lcp] = get_sa(s, 256); - sa_query lq(s, sa, sa_inv, lcp); + auto [sa, sa_inv, lcp] = get_sa(vi(all(s)), 256); + sa_query lq(vi(all(s)), sa, sa_inv, lcp); for (int i = 0; i < n; i++) for (int j = i; j < min(i + 2, n); j++) cout << lq.len_lcp(j, (n - i - 1) + n + 1) * 2 - diff --git a/tests/library_checker_aizu_tests/strings/lcp_query_zfunc.test.cpp b/tests/library_checker_aizu_tests/strings/lcp_query_zfunc.test.cpp index 2907240b..27471410 100644 --- a/tests/library_checker_aizu_tests/strings/lcp_query_zfunc.test.cpp +++ b/tests/library_checker_aizu_tests/strings/lcp_query_zfunc.test.cpp @@ -7,8 +7,8 @@ int main() { cin.tie(0)->sync_with_stdio(0); string s; cin >> s; - auto [sa, sa_inv, lcp] = get_sa(s, 256); - sa_query lq(s, sa, sa_inv, lcp); + auto [sa, sa_inv, lcp] = get_sa(vi(all(s)), 256); + sa_query lq(vi(all(s)), sa, sa_inv, lcp); // test `*_cmp` functions { for (int num_tests = 50; num_tests--;) { diff --git a/tests/library_checker_aizu_tests/strings/lcs_dp.test.cpp b/tests/library_checker_aizu_tests/strings/lcs_dp.test.cpp index e1f05902..943d06ac 100644 --- a/tests/library_checker_aizu_tests/strings/lcs_dp.test.cpp +++ b/tests/library_checker_aizu_tests/strings/lcs_dp.test.cpp @@ -11,7 +11,7 @@ int main() { cin >> s >> t; array res; for (int j = 0; j < 2; j++) { - lcs_dp lcs(t); + lcs_dp lcs(vi(all(t))); for (char c : s) lcs.push_onto_s(c); res[j] = int(count(begin(lcs.dp), end(lcs.dp), -1)); swap(s, t); diff --git a/tests/library_checker_aizu_tests/strings/lcs_queries.test.cpp b/tests/library_checker_aizu_tests/strings/lcs_queries.test.cpp index 0e7bfc01..4c17e348 100644 --- a/tests/library_checker_aizu_tests/strings/lcs_queries.test.cpp +++ b/tests/library_checker_aizu_tests/strings/lcs_queries.test.cpp @@ -13,7 +13,8 @@ int main() { cin >> a >> b >> c; queries[i] = {a, b, c}; } - vector res = lcs_queries(s, t, queries); + vector res = + lcs_queries(vi(all(s)), vi(all(t)), queries); for (int val : res) cout << val << '\n'; return 0; } diff --git a/tests/library_checker_aizu_tests/strings/lcs_queries_merge_sort_tree.test.cpp b/tests/library_checker_aizu_tests/strings/lcs_queries_merge_sort_tree.test.cpp index 25ea12f0..5190bea9 100644 --- a/tests/library_checker_aizu_tests/strings/lcs_queries_merge_sort_tree.test.cpp +++ b/tests/library_checker_aizu_tests/strings/lcs_queries_merge_sort_tree.test.cpp @@ -10,7 +10,7 @@ int main() { cin >> q >> s >> t; vector msts; { - lcs_dp lcs(t); + lcs_dp lcs(vi(all(t))); msts.emplace_back(lcs.dp); for (char c : s) { lcs.push_onto_s(c); diff --git a/tests/library_checker_aizu_tests/strings/manacher.test.cpp b/tests/library_checker_aizu_tests/strings/manacher.test.cpp index 690e9d9b..545b2d69 100644 --- a/tests/library_checker_aizu_tests/strings/manacher.test.cpp +++ b/tests/library_checker_aizu_tests/strings/manacher.test.cpp @@ -8,7 +8,7 @@ int main() { string s; cin >> s; int n = sz(s); - pal_query pq(s); + pal_query pq(vi(all(s))); vector longest(longest_from_index(pq)); { vector> tests; diff --git a/tests/library_checker_aizu_tests/strings/multi_matching_bs.test.cpp b/tests/library_checker_aizu_tests/strings/multi_matching_bs.test.cpp index 0f3b5a74..8e469d7d 100644 --- a/tests/library_checker_aizu_tests/strings/multi_matching_bs.test.cpp +++ b/tests/library_checker_aizu_tests/strings/multi_matching_bs.test.cpp @@ -9,12 +9,12 @@ int main() { cin.tie(0)->sync_with_stdio(0); string s; cin >> s; - auto [sa, sa_inv, lcp] = get_sa(s, 256); - sa_query sf_a(s, sa, sa_inv, lcp); + auto [sa, sa_inv, lcp] = get_sa(vi(all(s)), 256); + sa_query sf_a(vi(all(s)), sa, sa_inv, lcp); { auto [sa_le, sa_ri, s_l, s_r] = - sf_a.find_str_fast(string("")); - pair short_res = sf_a.find_str(string("")); + sf_a.find_str_fast(vi()); + pair short_res = sf_a.find_str(vi()); assert(sa_le == short_res.first && sa_ri == short_res.second); assert(sa_le == 0 && sa_ri == sz(s)); @@ -25,8 +25,9 @@ int main() { while (q--) { string t; cin >> t; - auto [sa_le, sa_ri, s_l, s_r] = sf_a.find_str_fast(t); - pair short_res = sf_a.find_str(t); + auto [sa_le, sa_ri, s_l, s_r] = + sf_a.find_str_fast(vi(all(t))); + pair short_res = sf_a.find_str(vi(all(t))); assert(sa_le == short_res.first && sa_ri == short_res.second); int str_len = s_r - s_l; diff --git a/tests/library_checker_aizu_tests/strings/prefix_function.test.cpp b/tests/library_checker_aizu_tests/strings/prefix_function.test.cpp index 02b05e88..83990336 100644 --- a/tests/library_checker_aizu_tests/strings/prefix_function.test.cpp +++ b/tests/library_checker_aizu_tests/strings/prefix_function.test.cpp @@ -7,7 +7,7 @@ int main() { string s; cin >> s; int n = sz(s); - vector pi = prefix_function(s); + vector pi = prefix_function(vi(all(s))); // prefix -> z func conversion // source: // https://codeforces.com/blog/entry/9612#comment-217621 diff --git a/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp b/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp index a538460a..69e5f28c 100644 --- a/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp +++ b/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp @@ -10,13 +10,13 @@ int main() { cin.tie(0)->sync_with_stdio(0); string s, t; cin >> s >> t; - auto [sa, sa_inv, lcp] = get_sa(s, 256); + auto [sa, sa_inv, lcp] = get_sa(vi(all(s)), 256); sa_query sf_a(s, sa, sa_inv, lcp); { auto [sa_le, sa_ri, s_l, s_r] = - sf_a.find_str_fast(string("")); + sf_a.find_str_fast(vi()); assert(sa_le == 0 && sa_ri == sz(s)); - pair short_res = sf_a.find_str(string("")); + pair short_res = sf_a.find_str(vi()); assert(sa_le == short_res.first && sa_ri == short_res.second); assert(s_r - s_l == 0); @@ -39,8 +39,9 @@ int main() { string both = s + '$' + t; int t_start = sz(s) + 1; auto [both_sa, both_sa_inv, both_lcp] = - get_sa(both, 256); - sa_query lq_both(both, both_sa, both_sa_inv, both_lcp); + get_sa(vi(all(both)), 256); + sa_query lq_both(vi(all(both)), both_sa, both_sa_inv, + both_lcp); vector> tests; if (sz(t) >= 2) tests.push_back({{t_start, t_start + 1}, diff --git a/tests/library_checker_aizu_tests/strings/suffix_array.test.cpp b/tests/library_checker_aizu_tests/strings/suffix_array.test.cpp index 2ad35f9f..c2c3e99a 100644 --- a/tests/library_checker_aizu_tests/strings/suffix_array.test.cpp +++ b/tests/library_checker_aizu_tests/strings/suffix_array.test.cpp @@ -6,15 +6,15 @@ int main() { cin.tie(0)->sync_with_stdio(0); { - string s = "a"; + vi s(1, 'a'); auto [_, _sa_inv, lcp] = get_sa(s, 256); assert(empty(lcp)); } string s; cin >> s; int n = sz(s); - auto [sa, sa_inv, lcp] = get_sa(s, 256); - sa_query sf_a(s, sa, sa_inv, lcp); + auto [sa, sa_inv, lcp] = get_sa(vi(all(s)), 256); + sa_query sf_a(vi(all(s)), sa, sa_inv, lcp); mono_st_asserts(lcp); assert(sz(sa) == n); assert(sz(sa_inv) == n); diff --git a/tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp b/tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp index 1924053f..bb25b839 100644 --- a/tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp +++ b/tests/library_checker_aizu_tests/strings/suffix_array_short.test.cpp @@ -9,7 +9,7 @@ int main() { cin.tie(0)->sync_with_stdio(0); string s; cin >> s; - auto [sa, sa_inv, _] = sa_short(s); + auto [sa, sa_inv, _] = sa_short(vi(all(s))); for (int i = 0; i < sz(s); i++) { assert(sa[sa_inv[i]] == i); assert(sa_inv[sa[i]] == i); diff --git a/tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp b/tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp index ea3c8a11..32be6cd3 100644 --- a/tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp +++ b/tests/library_checker_aizu_tests/strings/wildcard_pattern_matching.test.cpp @@ -1,7 +1,6 @@ #define PROBLEM \ "https://judge.yosupo.jp/problem/wildcard_pattern_matching" #include "../template.hpp" -using vl = vector; #include "../../../library/strings/wildcard_pattern_matching.hpp" namespace ignore { #include "../../../kactl/content/number-theory/ModPow.h" From c42db4ea60b5179f275ce334a34328d8f98f3b1f Mon Sep 17 00:00:00 2001 From: Luke Videckis Date: Tue, 5 Aug 2025 17:17:33 -0600 Subject: [PATCH 2/2] fix compile error --- .../strings/single_matching_bs.test.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp b/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp index 69e5f28c..f9eb9a84 100644 --- a/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp +++ b/tests/library_checker_aizu_tests/strings/single_matching_bs.test.cpp @@ -11,7 +11,7 @@ int main() { string s, t; cin >> s >> t; auto [sa, sa_inv, lcp] = get_sa(vi(all(s)), 256); - sa_query sf_a(s, sa, sa_inv, lcp); + sa_query sf_a(vi(all(s)), sa, sa_inv, lcp); { auto [sa_le, sa_ri, s_l, s_r] = sf_a.find_str_fast(vi()); @@ -21,8 +21,9 @@ int main() { sa_ri == short_res.second); assert(s_r - s_l == 0); } - auto [sa_le, sa_ri, s_l, s_r] = sf_a.find_str_fast(t); - pair short_res = sf_a.find_str(t); + auto [sa_le, sa_ri, s_l, s_r] = + sf_a.find_str_fast(vi(all(t))); + pair short_res = sf_a.find_str(vi(all(t))); assert( sa_le == short_res.first && sa_ri == short_res.second); int str_len = s_r - s_l;