Advertisement
coloriot

HA35

Dec 9th, 2024
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4.  
  5. class KMP {
  6. public:
  7.     KMP(const std::string& pattern) : pattern(pattern) {
  8.         FindMaxBorder();
  9.     }
  10.  
  11.     std::vector<int> search(const std::string& text) {
  12.         std::vector<int> result;
  13.         int m = pattern.size();
  14.         int n = text.size();
  15.         int i = 0;
  16.         int j = 0;
  17.  
  18.         while (i < n) {
  19.             if (pattern[j] == text[i]) {
  20.                 j++;
  21.                 i++;
  22.             }
  23.             if (j == m) {
  24.                 result.push_back(i - j);
  25.                 j = maxborder[j - 1];
  26.             } else if (i < n && pattern[j] != text[i]) {
  27.                 if (j != 0) {
  28.                     j = maxborder[j - 1];
  29.                 } else {
  30.                     i++;
  31.                 }
  32.             }
  33.         }
  34.         return result;
  35.     }
  36.  
  37.     std::vector<int> find_prefix() {
  38.         return maxborder;
  39.     }
  40.  
  41. private:
  42.     std::string pattern;
  43.     std::vector<int> maxborder;
  44.  
  45.     void FindMaxBorder() {
  46.         int m = pattern.size();
  47.         maxborder.resize(m);
  48.         int len = 0;
  49.         maxborder[0] = 0;
  50.         int i = 1;
  51.  
  52.         while (i < m) {
  53.             if (pattern[i] == pattern[len]) {
  54.                 len++;
  55.                 maxborder[i] = len;
  56.                 i++;
  57.             } else {
  58.                 if (len != 0) {
  59.                     len = maxborder[len - 1];
  60.                 } else {
  61.                     maxborder[i] = 0;
  62.                     i++;
  63.                 }
  64.             }
  65.         }
  66.     }
  67. };
  68.  
  69. int main() {
  70.     std::string text = "ababcabcabababd";
  71.     std::string pattern = "ababd";
  72.     KMP kmp(pattern);
  73.     std::vector<int> result = kmp.search(text);
  74.  
  75.     std::cout << "Паттерн найден по индексу: ";
  76.     for (int index : result) {
  77.         std::cout << index << " ";
  78.     }
  79.     std::cout << std::endl;
  80.  
  81.     std::vector<int> prefix = kmp.find_prefix();
  82.     std::cout << "Массив префиксов: ";
  83.     for (int p : prefix) {
  84.         std::cout << p << " ";
  85.     }
  86.     std::cout << std::endl;
  87.    
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement