HICONT

Algo.cpp

Nov 9th, 2023
806
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.10 KB | None | 0 0
  1. //Copyright 2023 Soloninko Andrey
  2.  
  3. #include "task_1/soloninko_a_non_matching_symbols/Algo.h"
  4.  
  5. std::string random_string(int length)
  6. {
  7.     const std::string CHARACTERS = "abcdefghijklmnopqrstuvwxyz";
  8.  
  9.     std::random_device random_device;
  10.     std::mt19937 generator(random_device());
  11.     std::uniform_int_distribution<> distribution(0, CHARACTERS.size() - 1);
  12.  
  13.     std::string random_string;
  14.  
  15.     for (int i = 0; i < length; ++i)
  16.     {
  17.         random_string += CHARACTERS[distribution(generator)];
  18.     }
  19.  
  20.     return random_string;
  21. }
  22.  
  23. int GetStringDifDef(std::string s1, std::string s2)
  24. {
  25.     int dif_coint = 0;
  26.     for(int i = 0; i < s1.size(); i++)
  27.     {
  28.         if(s1[i] != s2[i])
  29.         {
  30.             dif_coint++;
  31.         }
  32.     }
  33.     return dif_coint;
  34. }
  35.  
  36. int GetStringDifPar(std::string s1, std::string s2)
  37. {
  38.     int rank, size;
  39.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  40.     MPI_Comm_size(MPI_COMM_WORLD, &size);
  41.  
  42.     int str_len = s1.length();
  43.     std::vector<int> sendcounts(size);
  44.     std::vector<int> displs(size);
  45.  
  46.     int segment_size = str_len / size;
  47.     int remainder = str_len % size;
  48.  
  49.     for (int i = 0; i < size; i++) {
  50.         sendcounts[i] = segment_size;
  51.         if (i < remainder) {
  52.             sendcounts[i]++;
  53.         }
  54.  
  55.         if (i == 0) {
  56.             displs[i] = 0;
  57.         } else {
  58.             displs[i] = displs[i - 1] + sendcounts[i - 1];
  59.         }
  60.     }
  61.  
  62.     std::string local_str1(sendcounts[rank], ' ');
  63.     std::string local_str2(sendcounts[rank], ' ');
  64.  
  65.     MPI_Scatterv(s1.c_str(), sendcounts.data(), displs.data(), MPI_CHAR, &local_str1[0], sendcounts[rank], MPI_CHAR, 0, MPI_COMM_WORLD);
  66.     MPI_Scatterv(s2.c_str(), sendcounts.data(), displs.data(), MPI_CHAR, &local_str2[0], sendcounts[rank], MPI_CHAR, 0, MPI_COMM_WORLD);
  67.  
  68.     int local_dif_count = 0;
  69.  
  70.     for (int i = 0; i < local_str1.length(); i++) {
  71.         if (local_str1[i] != local_str2[i]) {
  72.             local_dif_count++;
  73.         }
  74.     }
  75.  
  76.     int dif_count = 0;
  77.     MPI_Reduce(&local_dif_count, &dif_count, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
  78.  
  79.     return dif_count;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment