37# include <gtest/gtest.h>
46 template <
typename T,
typename U>
60 expect_array_eq(pi, {0, 1, 0, 1, 2, 2, 3});
66 expect_array_eq(
matches, {0, 2});
72 expect_array_eq(
matches, {0, 1, 2, 3});
78 expect_array_eq(z, {5, 4, 3, 2, 1});
83 const std::string
text =
"abcababcababcab";
84 const std::string pattern =
"abcab";
90 for (
size_t i = 0; i < z.size(); ++i)
96 const std::string
text =
"abracadabra abracadabra";
97 const std::string pattern =
"abra";
103 for (
size_t i = 0; i <
got.size(); ++i)
109 const std::string
text =
"the quick brown fox jumps over the quick brown fox";
110 const std::string pattern =
"quick";
116 for (
size_t i = 0; i <
got.size(); ++i)
123 const auto b =
z_search(
"abcdefgh",
"xyz");
140 expect_array_eq(a, {0});
141 expect_array_eq(b, {0});
142 expect_array_eq(c, {0});
143 expect_array_eq(d, {0});
173 const std::string pattern =
"XYZW";
174 std::string
text(10000,
'a');
177 const size_t positions[] = {0, 42, 500, 1234, 5000, 9996};
179 text.replace(pos, pattern.size(), pattern);
191 for (
size_t i = 0; i <
kmp.size(); ++i)
206 for (
int i = 0; i < 256; ++i)
207 text.push_back(
static_cast<char>(i));
211 pattern.push_back(
static_cast<char>(0xFE));
212 pattern.push_back(
static_cast<char>(0xFF));
213 pattern.push_back(
static_cast<char>(0x00));
222 for (
size_t i = 0; i <
kmp.size(); ++i)
234 const std::string s =
"hello world";
236 expect_array_eq(
z_search(s, s), {0});
244 const std::string
text(1000,
'a');
245 const std::string pattern(4,
'a');
265 for (
int i = 0; i < 256; ++i)
266 text.push_back(
static_cast<char>(i));
271 pattern.push_back(
static_cast<char>(0x80));
272 pattern.push_back(
static_cast<char>(0x81));
273 pattern.push_back(
static_cast<char>(0x82));
280 for (
size_t i = 0; i < z.size(); ++i)
291 for (
int i = 0; i < 256; ++i)
292 text.push_back(
static_cast<char>(i));
295 const std::string pattern =
text.substr(250, 6);
302 for (
size_t i = 0; i < z.size(); ++i)
314 const std::string
text(5000,
'A');
315 const std::string pattern(7,
'A');
321 for (
size_t i = 0; i <
rk.size(); ++i)
333 for (
int i = 0; i < 500; ++i)
336 text.replace(99, 3,
"aba");
337 text.replace(600, 3,
"aba");
343 for (
size_t i = 0; i <
rk_aab.size(); ++i)
350 for (
size_t i = 0; i <
rk_aba.size(); ++i)
357 std::string
text(10000,
'x');
358 const std::string pattern(100,
'y');
361 text.replace(1234, 100, pattern);
362 text.replace(7777, 100, pattern);
368 for (
size_t i = 0; i <
rk.size(); ++i)
377 const std::string
text =
"the cat sat on the mat the cat";
378 const std::string pattern =
"the cat";
381 const uint64_t bases[] = {2, 31, 256, 1000000007ull, 911382323ull};
387 for (
size_t i = 0; i <
rk.size(); ++i)
394 std::mt19937
gen(42);
403 const int text_len = std::uniform_int_distribution<int>(0, 1000)(
gen);
404 int pat_len = std::uniform_int_distribution<int>(0, 50)(
gen);
407 if (
iter % 100 == 0)
pat_len = std::uniform_int_distribution<int>(100, 500)(
gen);
409 std::string
text(
static_cast<size_t>(text_len),
' ');
410 for (
int i = 0; i < text_len; ++i)
411 text[
static_cast<size_t>(i)] =
static_cast<char>(std::uniform_int_distribution<int>(0,
alphabet_size - 1)(
gen));
413 std::string pattern(
static_cast<size_t>(
pat_len),
' ');
414 for (
int i = 0; i <
pat_len; ++i)
415 pattern[
static_cast<size_t>(i)] =
static_cast<char>(std::uniform_int_distribution<int>(0,
alphabet_size - 1)(
gen));
418 if (
iter % 50 == 0 && text_len > 0) pattern =
text;
429 for (
size_t i = 0; i <
kmp.size(); ++i)
431 EXPECT_EQ(
kmp[i], z[i]) <<
"Mismatch at iteration " <<
iter <<
", index " << i;
Classical pattern searching algorithms over strings.
Simple dynamic array with automatic resizing and functional operations.
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
void expect_array_eq(const Array< size_t > &a, std::initializer_list< size_t > expected)
Assert that an Aleph::Array contains exactly the elements in an initializer_list.
Main namespace for Aleph-w library functions.
Array< size_t > z_search(const std::string_view text, const std::string_view pattern)
Find all occurrences of a pattern using the Z-algorithm.
Array< size_t > rabin_karp_search(const std::string_view text, const std::string_view pattern, const uint64_t base=911382323ull)
Find all occurrences using Rabin-Karp with rolling hash.
Array< size_t > z_algorithm(const std::string_view s)
Compute Z-array for a string.
Divide_Conquer_DP_Result< Cost > divide_and_conquer_partition_dp(const size_t groups, const size_t n, Transition_Cost_Fn transition_cost, const Cost inf=dp_optimization_detail::default_inf< Cost >())
Optimize partition DP using divide-and-conquer optimization.
std::decay_t< typename HeadC::Item_Type > T
Array< size_t > kmp_search(const std::string_view text, const std::string_view pattern)
Find all occurrences of a pattern using KMP.
Array< size_t > kmp_prefix_function(const std::string_view pattern)
Prefix-function used by KMP.
Array< size_t > boyer_moore_horspool_search(const std::string_view text, const std::string_view pattern)
Find all occurrences using Boyer-Moore-Horspool.