Advertisement
AmidamaruZXC

Untitled

Apr 26th, 2021
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.78 KB | None | 0 0
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<vector>
  4. #include<sstream>
  5. #include<map>
  6. #include<fstream>
  7. #include<omp.h>
  8.  
  9.  
  10. using namespace std;
  11.  
  12.  // Хэш-функция, переводит строку в хэш
  13. long long HashFun(string s) {
  14.     const int k = 31, mod = 1e9 + 7;
  15.  
  16.     long long h = 0, m = 1;
  17.     for (char c : s) {
  18.         int x = (int)(c - 'a' + 1);
  19.         h = (h + m * x) % mod;
  20.         m = (m * k) % mod;
  21.     }
  22.     return h;
  23. }
  24.  
  25. // Алгоритм Рабина-карпа для поиска подстроки в строке с помощью хэшей этих строк
  26. bool RabinKarp(string in_string, string tofind_string)
  27. {
  28.     long long in_hash = HashFun(in_string);
  29.     long long to_find_hash = HashFun(tofind_string);
  30.     // Сравнивание хэшей строк
  31.     if (in_hash == to_find_hash)
  32.     {
  33.         // посимвольное сравнивание 2 строк
  34.         for (int i = 0; i < in_string.length(); i++)
  35.         {
  36.             if (in_string[i] != tofind_string[i])
  37.             {
  38.                 return false;
  39.             }
  40.         }
  41.         return true;
  42.     }
  43.     return false;
  44. }
  45.  
  46. int main()
  47. {
  48.     setlocale(LC_ALL, "Rus");
  49.     string to_find_string;
  50.     ifstream initial_string(".\\initial_string.txt"); // Открываем стрим для считывания текстового файла с исходной строкой
  51.     cout << "Введите искомую строку:" << endl;
  52.     getline(cin, to_find_string); // Читаем подстроку, которую надо найти в исходной с консоли
  53.     bool flag = false;
  54.     initial_string.seekg(0, ios_base::end); // Перемещаем указатель ввода на последнюю позицию
  55.     long long string_len = initial_string.tellg(); // Смотрим позицию курсора(конец файла на данный момент)
  56.     int to_find_len = to_find_string.length(); // Длина введенной подстроки
  57.     int thread_count = 2;
  58.     //длина строки без последней части чтобы не выходить за пределы
  59.     int length_read = string_len - to_find_len + 1; // Длина исходной строки без длины подстроки
  60.     omp_set_num_threads(thread_count); // Ставим кол-во потоков по умолчанию на 2
  61.     double start_time;
  62.     double end_time;
  63.     start_time = omp_get_wtime();
  64.     int i;
  65. #pragma omp parallel shared(flag) private(i) // Для каждого потока своя i, но общий flag
  66.     {
  67. #pragma omp for
  68.         for (i = 0; i <= length_read; i++)
  69.         {
  70.             int word_start = i * to_find_len;
  71.             int word_finish = (i + 1) * to_find_len;
  72.  
  73.             char* current_word = new char[to_find_len]; // Объявляем динамический симсвольный массив на размер текущего слова
  74.  
  75.             initial_string.seekg(i, ios_base::beg); // Ставим на текущую позицию индексатора цикла
  76.             initial_string.get(current_word, to_find_len + 1); // Вырезаем текущее слово из строки и перемещаем в динам массив
  77.  
  78.             if (RabinKarp(current_word, to_find_string)) // Используем алгоритм робина-карпа, чтобы сравнить строки
  79.                 flag = true;
  80.         }
  81.     }
  82.     end_time = omp_get_wtime();
  83.     printf("Параллельный %f сек\n", end_time - start_time);
  84.     if (flag == false)
  85.     {
  86.         cout << "Нет совпадения" << endl;
  87.     }
  88.     else
  89.     {
  90.         cout << "есть совпадения" << endl;
  91.     }
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement