37# include <gtest/gtest.h>
49 const size_t id_she =
ac.add_pattern(
"she");
50 const size_t id_his =
ac.add_pattern(
"his");
51 const size_t id_hers =
ac.add_pattern(
"hers");
55 const auto matches =
ac.search(
"ahishers");
68 const size_t id_aa =
ac.add_pattern(
"aa");
69 const size_t id_aaa =
ac.add_pattern(
"aaa");
80 if (
m.pattern_id ==
id_a)
82 else if (
m.pattern_id ==
id_aa)
84 else if (
m.pattern_id ==
id_aaa)
111 const size_t id_she =
ac.add_pattern(
"she");
142 const size_t id =
ac.add_pattern(
"abc");
145 const auto matches =
ac.search(
"xxabcxx");
157 for (
int i = 0; i < 100; ++i)
159 std::string
pat =
"p";
164 pat += std::to_string(i);
171 std::string
text =
"xxp000xxp050xxp099xx";
177 for (
size_t i = 0; i <
matches.size(); ++i)
181 const auto &
pat =
ac.pattern(
m.pattern_id);
190 ac.add_pattern(
"hay");
196 for (
int i = 0; i < 2000; ++i)
199 text.replace(100, 6,
"needle");
200 text.replace(5000, 6,
"needle");
206 for (
size_t i = 0; i <
matches.size(); ++i)
207 if (
ac.pattern(
matches[i].pattern_id) ==
"needle")
216 const size_t id_b =
ac.add_pattern(
"b");
231 pat.push_back(
static_cast<char>(0x00));
232 pat.push_back(
static_cast<char>(0xFF));
236 std::string
text =
"abc";
237 text.push_back(
static_cast<char>(0x00));
238 text.push_back(
static_cast<char>(0xFF));
250 ac.add_pattern(
"she");
261 ac.add_pattern(
"she");
264 const auto matches =
ac.search(
"xyzxyz");
276 const size_t id_ab =
ac.add_pattern(
"ab");
277 const size_t id_abc =
ac.add_pattern(
"abc");
280 const auto matches =
ac.search(
"abcabc");
287 for (
size_t i = 0; i <
matches.size(); ++i)
313 const size_t id_ab =
ac.add_pattern(
"ab");
314 const size_t id_abc =
ac.add_pattern(
"abc");
315 const size_t id_bc =
ac.add_pattern(
"bc");
316 const size_t id_c =
ac.add_pattern(
"c");
327 for (
size_t i = 0; i <
matches.size(); ++i)
349 for (
int len = 1; len <= 10; ++len)
350 ids.
append(
ac.add_pattern(std::string(
static_cast<size_t>(len),
'x')));
354 const std::string
text(15,
'x');
359 for (
size_t i = 0; i < 10; ++i)
362 for (
size_t i = 0; i <
matches.size(); ++i)
366 for (
int k = 1;
k <= 10; ++
k)
368 static_cast<size_t>(15 -
k + 1))
369 <<
"pattern length " <<
k;
377 const size_t id_ab =
ac.add_pattern(
"ab");
378 const size_t id_abc =
ac.add_pattern(
"abc");
387 for (
size_t i = 0; i <
matches.size(); ++i)
416 std::string p =
"pat" + std::to_string(i);
425 text.reserve(200000);
426 for (
int i = 0; i < 5000; ++i)
428 text +=
"some_random_filler_";
438 const auto &
pat =
ac.pattern(
m.pattern_id);
Multi-pattern string matching with the Aho-Corasick automaton.
Aho-Corasick multi-pattern automaton.
size_t add_pattern(std::string pattern)
Add one pattern to the automaton.
Simple dynamic array with automatic resizing and functional operations.
static Array create(size_t n)
Create an array with n logical elements.
T & append(const T &data)
Append a copy of data
constexpr size_t size() const noexcept
Returns the number of entries in the table.
Main namespace for Aleph-w library functions.
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.
One match occurrence in the searched text.
FooMap m(5, fst_unit_pair_hash, snd_unit_pair_hash)