Advertisement
Josif_tepe

Untitled

Nov 6th, 2024
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.75 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. string text;
  5.  
  6. int * LPS(const string & subStr) {
  7.     int n = subStr.size();
  8.     int * lps = new int[n];
  9.    
  10.     int j = 0;
  11.     lps[0] = 0;
  12.    
  13.     int i = 1;
  14.     while(i < n) {
  15.         if(subStr[i] == subStr[j]) {
  16.             j++;
  17.             lps[i] = j;
  18.             i++;
  19.         }
  20.         else {
  21.             if(j == 0) {
  22.                 lps[i] = 0;
  23.                 i++;
  24.             }
  25.             else {
  26.                 j = lps[j - 1];
  27.             }
  28.         }
  29.     }
  30.    
  31.     return lps;
  32. }
  33. int * reverseLPS(const string & subStr) {
  34.     int m = subStr.size();
  35.     int * lps = new int[m];
  36.     int len = 0;
  37.         int i = m - 2;
  38.        
  39.         while (i >= 0) {
  40.             if (subStr[i] == subStr[m - 1 - len]) {
  41.                 len++;
  42.                 lps[i] = len;
  43.                 i--;
  44.             } else {
  45.                 if (len != 0) {
  46.                     len = lps[m - len];
  47.                 } else {
  48.                     lps[i] = 0;
  49.                     i--;
  50.                 }
  51.             }
  52.         }
  53.     for(int i = 0; i < m; i++) {
  54.         cout << lps[i] << " ";
  55.     }
  56.     return lps;
  57. }
  58. int* findAllSubStr(const string & subStr) {
  59.     int * lps = LPS(subStr);
  60.     int n = subStr.size();
  61.     int * res = new int[n];
  62.     int r = 0;
  63.    
  64.     int i = 0, j = 0;
  65.     while(i < (int) text.size()) {
  66.         if(text[i] == subStr[j]) {
  67.             i++;
  68.             j++;
  69.            
  70.             if(j == n) {
  71.                 res[r++] = i - j;
  72.                 cout << i - j << endl;
  73.                 j = lps[j - 1];
  74.             }
  75.         }
  76.         else {
  77.             if(j != 0) {
  78.                 j = lps[j - 1];
  79.             }
  80.             else {
  81.                 i++;
  82.             }
  83.         }
  84.     }
  85.    
  86.     int *res_array = new int[r];
  87.     for(int i = 0; i < r; i++) {
  88.         res_array[i] = res[i];
  89.     }
  90.    
  91.     return res_array;
  92. }
  93. int findFirstSubStr(const string & subStr) {
  94.     int * lps = LPS(subStr);
  95.     int n = subStr.size();
  96.    
  97.     int i = 0, j = 0;
  98.     while(i < (int) text.size()) {
  99.         if(text[i] == subStr[j]) {
  100.             i++;
  101.             j++;
  102.            
  103.             if(j == n) {
  104.                 return i - j;
  105.             }
  106.         }
  107.         else {
  108.             if(j != 0) {
  109.                 j = lps[j - 1];
  110.             }
  111.             else {
  112.                 i++;
  113.             }
  114.         }
  115.     }
  116.     return -1;
  117. }
  118. int findLastSubStr(const string & subStr) {
  119.     int * lps = reverseLPS(subStr);
  120.     int m = subStr.size();
  121.    
  122.     int i = text.size() - 1, j = m - 1;
  123.     while(i >= 0) {
  124.         if(text[i] == subStr[j]) {
  125.             i--;
  126.             j--;
  127.            
  128.         }
  129.         if(j < 0) {
  130.             return i + 1;
  131.         }
  132.         else if(i >= 0 and text[i] != subStr[j]) {
  133.             if(j != m - 1) {
  134.                 j = m - 1 - lps[j];
  135.             }
  136.             else {
  137.                 i--;
  138.             }
  139.         }
  140.     }
  141.     return -1;
  142. }
  143. int * findAllSubStrReverse(const string & subStr) {
  144.     int * lps = reverseLPS(subStr);
  145.     int m = subStr.size();
  146.     int * res = new int [m];
  147.     int i = text.size() - 1, j = m - 1;
  148.     int last_pos = -1;
  149.     int r = 0;
  150.     while(i >= 0) {
  151.         if(text[i] == subStr[j]) {
  152.             i--;
  153.             j--;
  154.            
  155.         }
  156.         if(j < 0) {
  157.             j = m - 1 - lps[j + 1];
  158.             res[r++] = i + 1;
  159.         }
  160.         else if(i >= 0 and text[i] != subStr[j]) {
  161.             if(j != m - 1) {
  162.                 j = m - 1 - lps[j];
  163.             }
  164.             else {
  165.                 i--;
  166.             }
  167.         }
  168.     }
  169.     return res;
  170. }
  171. int main() {
  172.     text = "ababxabababaxababa";
  173.     string pat = "ababa";
  174.     findAllSubStr(pat);
  175.     return 0;
  176. }
  177.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement