Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. class KMPSearcher {
  6.  public:
  7.   explicit KMPSearcher(const std::string &pattern)
  8.       : pattern_(pattern) {
  9.     pi_.resize(pattern.size());
  10.   }
  11.  
  12.   template <class Callback>
  13.   void Search(const std::string& text_, Callback on_occurrence)  {
  14.     bool pattern_letter = true;
  15.     size_t prev = 0;
  16.     size_t pattern_size = pattern_.size();
  17.     for (size_t i = 0; i < text_.size() + pattern_size; ++i) {
  18.       if (i == pattern_size) {
  19.         prev = 0;
  20.         pattern_letter = false;
  21.         continue;
  22.       }
  23.       if (pattern_letter) {
  24.         prev = pi_[i - 1];
  25.       }
  26.       while ((prev > 0) && (((i >= pattern_size) && (text_[prev] != text_[i]))
  27.           || (pattern_[prev] != pattern_[i]))) {
  28.         prev = pi_[prev - 1];
  29.       }
  30.       if (((i >= pattern_size) && (text_[i] == text_[prev])) || (pattern_[i] == pattern_[prev])) {
  31.         ++prev;
  32.         if (pattern_letter) {
  33.           pi_[i] = prev;
  34.         }
  35.       }
  36.       if (prev == pattern_size) {
  37.         on_occurrence(i - prev - pattern_size);
  38.       }
  39.     }
  40.   }
  41.  private:
  42.   const std::string &pattern_;
  43.   std::vector<size_t> pi_ ;
  44. };
  45.  
  46. int main() {
  47.   std::string pattern;
  48.   std::string text;
  49.   std::cin >> pattern >> text;
  50.   pattern += '#';
  51.   KMPSearcher main_pattern(pattern);
  52.   main_pattern.Search(text, [&](size_t left) { std::cout << left << " "; });
  53.   return 0;
  54. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement