vadimk772336

Untitled

Apr 10th, 2022 (edited)
952
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. struct suffix
  5. {
  6.     int pos;
  7.     int rank[2];
  8. };
  9.  
  10. bool operator<(const struct suffix& a, const struct suffix& b)
  11. {
  12.     if (a.rank[0] == b.rank[0])
  13.         return (a.rank[1] < b.rank[1]);
  14.  
  15.     return (a.rank[0] < b.rank[0]);
  16. }
  17.  
  18. int get_max_count(suffix arr[], int n)
  19. {
  20.     suffix max_suff = arr[0];
  21.     for (int i = 1; i < n; ++i)
  22.         if (max_suff < arr[i])
  23.             max_suff = arr[i];
  24.  
  25.     int max_val = (max_suff.rank[0] < max_suff.rank[1]) ? max_suff.rank[1] : max_suff.rank[0];
  26.  
  27.     return max_val + 1;
  28. }
  29.  
  30. void radix_sort(suffix A[], int n)
  31. {
  32.  
  33.     suffix B[n];
  34.     int max_val = get_max_count(A, n);
  35.     int C[max_val];
  36.  
  37.     for (int d, i = 1; i > -1; --i)
  38.     {
  39.         for (int j = 0; j < max_val; ++j)
  40.         {
  41.             C[j] = 0;
  42.         }
  43.  
  44.         for (int j = 0; j < n; ++j)
  45.         {
  46.             d = A[j].rank[i];
  47.             C[d]++;
  48.         }
  49.  
  50.         for (int tmp, count = 0, j = 0; j < max_val; ++j)
  51.         {
  52.             tmp = C[j];
  53.             C[j] = count;
  54.             count += tmp;
  55.         }
  56.  
  57.         for (int j = 0; j < n; ++j)
  58.         {
  59.             d = A[j].rank[i];
  60.             B[C[d]] = A[j];
  61.             C[d]++;
  62.         }
  63.  
  64.         for (int j = 0; j < n; ++j)
  65.         {
  66.             A[j] = B[j];
  67.         }
  68.     }
  69. }
  70.  
  71.  
  72. int* get_suff_array(std::string str, int n)
  73. {
  74.     suffix suffixes[n];
  75.  
  76.     for (int i = 0; i < n; ++i)
  77.     {
  78.         suffixes[i].pos = i;
  79.         suffixes[i].rank[0] = str[i] - 'a' + 1;
  80.  
  81.         if (i < n - 1)
  82.             suffixes[i].rank[1] = str[i + 1] - 'a' + 1;
  83.         else
  84.             suffixes[i].rank[1] = 0;
  85.     }
  86.  
  87.     radix_sort(suffixes, n);
  88.  
  89.     int pos_to_suff_idx[n];
  90.  
  91.     for (int k = 4; k < 2 * n; k = k * 2)
  92.     {
  93.         int rank = 1;
  94.         int prev_rank = suffixes[0].rank[0];
  95.         suffixes[0].rank[0] = rank;
  96.         pos_to_suff_idx[suffixes[0].pos] = 0;
  97.  
  98.         for (int i = 1; i < n; ++i)
  99.         {
  100.             if (suffixes[i].rank[0] == prev_rank && suffixes[i].rank[1] == suffixes[i - 1].rank[1])
  101.             {
  102.                 suffixes[i].rank[0] = rank;
  103.             }
  104.             else
  105.             {
  106.                 prev_rank = suffixes[i].rank[0];
  107.                 suffixes[i].rank[0] = ++rank;
  108.             }
  109.             pos_to_suff_idx[suffixes[i].pos] = i;
  110.         }
  111.  
  112.         for (int next_idx, suff_idx, i = 0; i < n; ++i)
  113.         {
  114.             next_idx = suffixes[i].pos + k / 2;
  115.             if (next_idx < n)
  116.             {
  117.                 suff_idx = pos_to_suff_idx[next_idx];
  118.                 suffixes[i].rank[1] = suffixes[suff_idx].rank[0];
  119.             }
  120.             else
  121.             {
  122.                 suffixes[i].rank[1] = 0;
  123.             }
  124.         }
  125.  
  126.         radix_sort(suffixes, n);
  127.     }
  128.  
  129.     int* suff_array = new int[n];
  130.     for (int i = 0; i < n; ++i)
  131.         suff_array[i] = suffixes[i].pos;
  132.  
  133.     return suff_array;
  134. }
  135.  
  136. void display(int arr[], int n)
  137. {
  138.     for (int i = 0; i < n; i++)
  139.         std::cout << arr[i] << " ";
  140.     std::cout << std::endl;
  141. }
  142.  
  143. void display_BW(const std::string text, const int SA[])
  144. {
  145.     int n = text.size();
  146.     for (int i = 0; i < n; ++i)
  147.     {
  148.         if (SA[i] != 0)
  149.             std::cout << text[SA[i] - 1];
  150.         else
  151.             std::cout << text[n - 1];
  152.     }
  153. }
  154.  
  155. int main()
  156. {
  157.     std::string text;
  158.     std::cin >> text;
  159.     int n = text.size();
  160.     int* SA = get_suff_array(text, n);
  161.  
  162.     // display(SA, n);
  163.  
  164.     display_BW(text, SA);
  165.  
  166.     return 0;
  167. }
Advertisement
Add Comment
Please, Sign In to add comment