Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- class KMPSearcher {
- public:
- explicit KMPSearcher(const std::string &pattern)
- : pattern_(pattern) {
- pi_.resize(pattern.size());
- }
- template <class Callback>
- void Search(const std::string& text_, Callback on_occurrence) {
- bool pattern_letter = true;
- size_t prev = 0;
- size_t pattern_size = pattern_.size();
- for (size_t i = 0; i < text_.size() + pattern_size; ++i) {
- if (i == pattern_size) {
- prev = 0;
- pattern_letter = false;
- continue;
- }
- if (pattern_letter) {
- prev = pi_[i - 1];
- }
- while ((prev > 0) && (((i >= pattern_size) && (text_[prev] != text_[i]))
- || (pattern_[prev] != pattern_[i]))) {
- prev = pi_[prev - 1];
- }
- if (((i >= pattern_size) && (text_[i] == text_[prev])) || (pattern_[i] == pattern_[prev])) {
- ++prev;
- if (pattern_letter) {
- pi_[i] = prev;
- }
- }
- if (prev == pattern_size) {
- on_occurrence(i - prev - pattern_size);
- }
- }
- }
- private:
- const std::string &pattern_;
- std::vector<size_t> pi_ ;
- };
- int main() {
- std::string pattern;
- std::string text;
- std::cin >> pattern >> text;
- pattern += '#';
- KMPSearcher main_pattern(pattern);
- main_pattern.Search(text, [&](size_t left) { std::cout << left << " "; });
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement