90 arg.resize(str.size() + 1, 0);
94 std::vector<size_t> border_pos(str.size() + 1, 0);
96 size_t current_char = str.length();
98 size_t border_index = str.length() + 1;
100 border_pos[current_char] = border_index;
102 while (current_char > 0) {
103 while (border_index <= str.length() &&
104 str[current_char - 1] != str[border_index - 1]) {
105 if (arg[border_index] == 0) {
106 arg[border_index] = border_index - current_char;
109 border_index = border_pos[border_index];
114 border_pos[current_char] = border_index;
117 size_t largest_border_index = border_pos[0];
119 for (
size_t i = 0; i < str.size(); i++) {
121 arg[i] = largest_border_index;
125 if (i == largest_border_index) {
126 largest_border_index = border_pos[largest_border_index];
166 size_t index_position = arg.pat.size() - 1;
167 std::vector<size_t> index_storage;
169 while (index_position < str.length()) {
170 size_t index_string = index_position;
171 int index_pattern =
static_cast<int>(arg.pat.size()) - 1;
173 while (index_pattern >= 0 &&
174 str[index_string] == arg.pat[index_pattern]) {
179 if (index_pattern < 0) {
180 index_storage.push_back(index_position - arg.pat.length() + 1);
183 index_position += std::max(arg.
bad_char[str[index_string]],
188 return index_storage;