step20
Loading...
Searching...
No Matches
substring_search.hpp
Go to the documentation of this file.
1// Andrew Naplavkov
2
3#ifndef STEP20_SUBSTRING_SEARCH_HPP
4#define STEP20_SUBSTRING_SEARCH_HPP
5
6#include "suffix_array.hpp"
7#include "suffix_tree.hpp"
8
10
12
15template <class... Ts>
17 std::ranges::forward_range auto&& str)
18 -> std::optional<typename suffix_array<Ts...>::size_type>
19{
20 if (std::ranges::empty(str))
21 return arr.size();
22 for (auto pos : arr.find(str))
23 return pos;
24 return std::nullopt;
25}
26
28template <class... Ts>
30 std::basic_string<typename suffix_array<Ts...>::value_type> str)
31 -> generator<typename suffix_array<Ts...>::size_type>
32{
33 if (std::ranges::empty(str))
34 co_yield arr.size();
35 for (auto pos : arr.find(str))
36 co_yield pos;
37}
38
40
42template <class... Ts>
44 std::ranges::forward_range auto&& str)
45 -> std::optional<typename suffix_tree<Ts...>::size_type>
46{
47 if (auto edge = tree.find(str))
48 return tree.labels(*edge).first;
49 return std::ranges::empty(str) ? std::optional{0} : std::nullopt;
50}
51
53
57template <class... Ts>
59 std::basic_string<typename suffix_tree<Ts...>::value_type> str)
60 -> generator<typename suffix_tree<Ts...>::size_type>
61{
62 if (std::ranges::empty(str))
63 co_yield tree.size();
64 if (auto start = tree.find(str))
65 for (auto edge : tree.depth_first_search(*start))
66 if (tree.leaf(edge.child_node))
67 co_yield tree.labels(edge).first;
68}
69
70} // namespace step20::substring_search
71
72#endif // STEP20_SUBSTRING_SEARCH_HPP
Manber's algorithm for constructing sorted array of non-empty suffixes.
Definition suffix_array.hpp:23
Char value_type
Definition suffix_array.hpp:25
Size size() const
Definition suffix_array.hpp:28
Ukkonen's online algorithm for constructing suffix tree.
Definition suffix_tree.hpp:24
Char value_type
Definition suffix_tree.hpp:26
slice_type labels(const edge_type &edge) const
Definition suffix_tree.hpp:89
Size size() const
Definition suffix_tree.hpp:29
Definition substring_search.hpp:9
auto find_all(const suffix_array< Ts... > &arr, std::basic_string< typename suffix_array< Ts... >::value_type > str) -> generator< typename suffix_array< Ts... >::size_type >
Find all occurrences of the substring.
Definition substring_search.hpp:29
auto find_any(const suffix_array< Ts... > &arr, std::ranges::forward_range auto &&str) -> std::optional< typename suffix_array< Ts... >::size_type >
Find substring offset.
Definition substring_search.hpp:16
auto find_first(const suffix_tree< Ts... > &tree, std::ranges::forward_range auto &&str) -> std::optional< typename suffix_tree< Ts... >::size_type >
Find offset of the first occurrence of the substring.
Definition substring_search.hpp:43
Definition generator.hpp:19
Size first
Definition suffix_tree.hpp:72