Advertisement
iawitm

Untitled

Apr 17th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.47 KB | None | 0 0
  1. void bmSearch(string str, string substr, bool reg) {
  2.   int iterations = 0;
  3.   bool flag = false;
  4.   //Вычислить длину исходной строки
  5.   int n = str.length();
  6.  
  7.   //Вычислить длину образа
  8.   int m = substr.length();
  9.  
  10.   //Заполнить таблицу для этого алгоритма
  11.   vector < int > d;
  12.   d.reserve(ALPHABET_LENGTH);
  13.   d = bmTable(substr, reg);
  14.  
  15.   //Переменная смещения образа по отношению к тексту
  16.   int s = 0;
  17.   if (reg) {
  18.     //Пока s меньше, чем разность длины строки и образа
  19.     while (s <= (n - m)) {
  20.       int j = m - 1;
  21.  
  22.       //Если образ совпадает со строкой, начиная с конца
  23.       if ((j >= 0) && compareWithRegister(substr[j], str[s + j]))
  24.         while ((j >= 0) && compareWithRegister(substr[j], str[s + j])) {
  25.           j--; //Двигаться от конца образа
  26.           iterations++;
  27.         }
  28.       else {
  29.         iterations++;
  30.       }
  31.  
  32.       //Если образ полностью совпал со строкой
  33.       if (j < 0) {
  34.         cout << "found " << s << endl;
  35.         flag = true;
  36.  
  37.         //Сдвинуть образ так, чтобы следующий символ в тексте совпадал с последним
  38.         //таким же символом в образе или на 1, если длины строки не хватает
  39.         if (reg)
  40.           s += ((s + m) < n) ? m - d[str[s + m]] : 1;
  41.         else
  42.           s += ((s + m) < n) ? m - d[tolower(str[s + m])] : 1;
  43.       } else {
  44.         //Сдвинуть образ так, чтобы символ в тексте, не совпавший с символом
  45.         //в образе, совпадал с последним таким же символом в образе или на 1,
  46.         //если совпадающий символ правее текущего символа в образе
  47.         if (reg) {
  48.           if (1 >= (j - d[str[s + j]])) {
  49.             s++;
  50.           } else {
  51.             s += j - d[str[s + j]];
  52.           }
  53.  
  54.         } else{
  55.             if (1 >= (j - d[tolower(str[s + j]]))) {
  56.             s++;
  57.           } else {
  58.             s += j - d[tolower(str[s + j])];
  59.           }
  60.         }
  61.       }
  62.     }
  63.   } else {
  64.     while (s <= (n - m)) {
  65.       int j = m - 1;
  66.  
  67.       //Если образ совпадает со строкой, начиная с конца
  68.       if ((j >= 0) && compareWithRegister(substr[j], str[s + j]))
  69.         while ((j >= 0) && compareWithoutRegister(substr[j], str[s + j])) {
  70.           j--; //Двигаться от конца образа
  71.           iterations++;
  72.         }
  73.       else {
  74.         iterations++;
  75.       }
  76.  
  77.       //Если образ полностью совпал со строкой
  78.       if (j < 0) {
  79.         cout << "Found with BM, index " << s << endl;
  80.         flag = true;
  81.  
  82.         //Сдвинуть образ так, чтобы следующий символ в тексте совпадал с последним
  83.         //таким же символом в образе или на 1, если длины строки не хватает
  84.         if (reg){
  85.             if (((s + m) < n)) {
  86.             s+= m - d[str[s + m]];
  87.           } else {
  88.             s++;
  89.           }
  90.             }
  91.         else{
  92.             if (((s + m) < n)) {
  93.             s+= m - d[tolower(str[s + m])];
  94.           } else {
  95.             s++;
  96.         }
  97.       } else {
  98.         //Сдвинуть образ так, чтобы символ в тексте, не совпавший с символом
  99.         //в образе, совпадал с последним таким же символом в образе или на 1,
  100.         //если совпадающий символ правее текущего символа в образе
  101.         if (reg) {
  102.           if (1 >= (j - d[str[s + j]])) {
  103.             s++;
  104.           } else {
  105.             s += j - d[str[s + j]];
  106.           }
  107.  
  108.         } else{
  109.             if (1 >= (j - d[str[s + j]])) {
  110.             s++;
  111.           } else {
  112.             s += j - d[tolower(str[s + j])];
  113.           }
  114.         }
  115.       }
  116.     }
  117.   }
  118.   // flag нужен, чтобы нот фаунд не выводилось после успешного нахождения
  119.   if ((s > n - m) & !(flag))
  120.     cout << "Not found with BM" << endl;
  121.   cout << "BM iterations = " << iterations << endl;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement