vadimk772336

Untitled

Apr 10th, 2022
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.62 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6.  
  7. struct suffix
  8. {
  9. int index;
  10. int rank[2];
  11. };
  12.  
  13. bool operator<(const struct suffix& a, const struct suffix& b)
  14. {
  15. if (a.rank[0] == b.rank[0])
  16. {
  17. if (a.rank[1] < b.rank[1])
  18. return true;
  19. else
  20. return false;
  21. }
  22. else if (a.rank[0] < b.rank[0])
  23. return true;
  24. else
  25. return false;
  26.  
  27. }
  28.  
  29. int getMax(suffix arr[], int n)
  30. {
  31.  
  32. suffix mx = arr[0];
  33. for (int i = 1; i < n; ++i)
  34. if (mx < arr[i])
  35. mx = arr[i];
  36.  
  37. int max_val = (mx.rank[0] < mx.rank[1]) ? mx.rank[1] : mx.rank[0];
  38.  
  39. return max_val+1;
  40. }
  41.  
  42. bool operator == (const struct suffix& a, const struct suffix& b)
  43. {
  44. return (a.rank[0] == b.rank[0] && a.rank[1] == b.rank[1]);
  45. }
  46.  
  47. void radix_sort(suffix A[], int n)
  48. {
  49.  
  50. suffix B[n];
  51. int max_val = getMax(A, n);
  52. int C[max_val];
  53.  
  54.  
  55. int d, tmp, count;
  56.  
  57.  
  58. for (int i = 1; i > -1; --i)
  59. {
  60. cout << "i= " << i << endl;
  61. for (int j = 0; j < max_val; ++j)
  62. {
  63. C[j] = 0;
  64. }
  65.  
  66. cout << "000" << endl;
  67. for (int j = 0; j < n; ++j)
  68. {
  69. d = A[j].rank[i];
  70.  
  71. C[d]++;
  72. cout << "d , C[d] = " << d << " " << C[d] << endl;
  73.  
  74. }
  75. cout << "C1" << endl;
  76. for (int k=0 ; k < max_val; ++k)
  77. {
  78. cout << C[k] << " ";
  79. }
  80. cout << endl;
  81.  
  82. count = 0;
  83. for (int j = 0; j < max_val; ++j)
  84. {
  85. tmp = C[j];
  86. C[j] = count;
  87. count += tmp;
  88. }
  89.  
  90. cout << "C2" << endl;
  91. for (int k=0 ; k < max_val; ++k)
  92. {
  93. cout << C[k] << " ";
  94. }
  95. cout << endl;
  96.  
  97. cout <<"asbs"<<endl;
  98. for (int j = 0; j < n; ++j)
  99. {
  100. d = A[j].rank[i];
  101. if (d != -1)
  102. {
  103. cout << "d , C[d] = " << d << " " << C[d] << endl;
  104. B[C[d]] = A[j];
  105. C[d]++;
  106. }
  107. }
  108.  
  109. cout << "B" << endl;
  110. for (int k=0 ; k < n-1; ++k)
  111. {
  112. //cout << " k= " << k << endl;
  113. cout << B[k].rank[0] << " " << B[k].rank[1] << endl;
  114. }
  115.  
  116. for (int j = 0; j < n; ++j)
  117. {
  118. A[j] = B[j];
  119. }
  120.  
  121. cout << "==========" << endl;
  122. }
  123.  
  124. }
  125.  
  126.  
  127. int* get_suff_array(char* str, int n)
  128. {
  129. suffix suffixes[n];
  130.  
  131. for (int i = 0; i < n; ++i)
  132. {
  133. suffixes[i].index = i;
  134. suffixes[i].rank[0] = str[i] - 'a';
  135.  
  136. if (i + 1 < n)
  137. suffixes[i].rank[1] = str[i + 1] - 'a';
  138. else
  139. suffixes[i].rank[1] = -1;
  140. }
  141.  
  142. radix_sort(suffixes, n);
  143.  
  144. int pos_to_suff_idx[n];
  145.  
  146. for (int k = 4; k < 2 * n; k = k * 2)
  147. {
  148. int rank = 0;
  149. int prev_rank = suffixes[0].rank[0];
  150. suffixes[0].rank[0] = rank;
  151. pos_to_suff_idx[suffixes[0].index] = 0;
  152.  
  153. for (int i = 1; i < n; ++i)
  154. {
  155. // if suffixes[i-1] == suffixes[i] or suffixes[i].rank[0] == suffixes[i - 1].rank[0]
  156. if (suffixes[i].rank[0] == prev_rank && suffixes[i].rank[1] == suffixes[i - 1].rank[1])
  157. {
  158. // prev_rank = suffixes[i].rank[0];
  159. suffixes[i].rank[0] = rank;
  160. }
  161. else
  162. {
  163. prev_rank = suffixes[i].rank[0];
  164. suffixes[i].rank[0] = ++rank;
  165. }
  166. pos_to_suff_idx[suffixes[i].index] = i;
  167. }
  168.  
  169. for (int next_idx, suff_idx, i = 0; i < n; ++i)
  170. {
  171. next_idx = suffixes[i].index + k / 2;
  172. if (next_idx < n)
  173. {
  174. suff_idx = pos_to_suff_idx[next_idx];
  175. suffixes[i].rank[1] = suffixes[suff_idx].rank[0];
  176. }
  177. else
  178. {
  179. suffixes[i].rank[1] = -1;
  180. }
  181. }
  182.  
  183. radix_sort(suffixes, n);
  184. }
  185.  
  186. int *suff_array = new int[n];
  187. for (int i = 0; i < n; ++i)
  188. suff_array[i] = suffixes[i].index;
  189.  
  190. return suff_array;
  191. }
  192.  
  193. void printArr(int arr[], int n)
  194. {
  195. for (int i = 0; i < n; i++)
  196. cout << arr[i] << " ";
  197. cout << endl;
  198. }
  199.  
  200. int main()
  201. {
  202. char txt[] = "banana";
  203. int n = strlen(txt);
  204. int* suffixArr = get_suff_array(txt, n);
  205. cout << "Following is suffix array for " << txt << endl;
  206. printArr(suffixArr, n);
  207. return 0;
  208. }
Advertisement
Add Comment
Please, Sign In to add comment