Advertisement
AmidamaruZXC

Untitled

Apr 26th, 2021
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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