Advertisement
Guest User

name

a guest
Oct 18th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. void PocketSort( std::vector<char>& a ) {
  5.  
  6. int k = 0; //максимальный элемент в словаре
  7.  
  8. std::vector <int> a_num(a.size());
  9. for (int i = 0; i < a.size(); ++i){
  10. if (a[i] != '\0') {
  11. a_num[i] = a[i] - 'a';// делаем числовой суффикс
  12. std::cout << a_num[i];
  13. }
  14. }
  15.  
  16. for (int i = 0; i < a_num.size(); ++i){
  17. if (k < a_num[i])
  18. k = a_num[i]; //максимальная цифра
  19. }
  20.  
  21. /*std::vector<int> c( k, 0 );
  22. for( int i = 0; i < a.size(); ++i )
  23. ++c[a[i]];
  24. for( int i = 1; i < k; ++i ) {
  25. c[i] += c[i - 1]; // Концы групп.
  26. }
  27. std::vector<int> b( a.size() );
  28. for( int i = a.size() - 1; i >= 0; --i ) {
  29. b[--c[a[i]]] = a[i];
  30. }*/
  31. //a = std::move( b );
  32. }
  33.  
  34. /*void BuildSuffArrayStep(std::vector<int>& a, std::vector<int>& pockets)
  35. {
  36. PocketSort(a);
  37. std::vector <int> b(a.size(), 0);
  38. //std::vector <int> c(pockets.size(), 0);
  39.  
  40. for (int i = 0; i < pockets.size(); ++i)
  41. pockets[i] = c[i];
  42.  
  43. for ( int k = 0; 2^k < a.size(); ++k )
  44. {
  45. for( int i = a.size() - 1; i >= 0; --i )
  46. b[--c[pockets[a[i] – 2^k]] = a[i] – 2^k;
  47. }
  48.  
  49.  
  50. a = std::move( b );
  51. }*/
  52.  
  53. int main() {
  54.  
  55. char ival;
  56. std::vector <char> v;
  57. while (std::cin >> ival)
  58. v.push_back(ival);
  59. v.push_back('\0'); //считали строку с поправкой на длину
  60.  
  61. PocketSort(v);
  62. return 0;
  63. }
  64. /*
  65. int main() {
  66.  
  67. char *s; // входная строка
  68. int n; // длина строки
  69.  
  70. std::cin >> n;
  71. for (int i = 0; i < n; ++i)
  72. std::cin >> s[i];
  73.  
  74. const int maxlen = n; // максимальная длина строки (не меняется жи?!)
  75. const int alphabet = 26; // размер алфавита, <= maxlen
  76.  
  77. int p[maxlen], cnt[maxlen], c[maxlen];
  78. //memset (cnt, 0, alphabet * sizeof(int));
  79. for (int i = 0; i < n; ++i)
  80. ++cnt[s[i]]; //запись вхождений
  81. for (int i = 1; i < alphabet; ++i)
  82. cnt[i] += cnt[i-1]; //границы групп
  83. for (int i=0; i<n; ++i)
  84. p[--cnt[s[i]]] = i; //отсортированная строка
  85. c[p[0]] = 0;
  86. int classes = 1;
  87. for (int i = 1; i < n; ++i) { //классы эквивалентности
  88. if (s[p[i]] != s[p[i - 1]])
  89. ++classes;
  90. c[p[i]] = classes - 1; //классы с 0
  91. }
  92.  
  93. int pn[maxlen], cn[maxlen];
  94.  
  95. for (int h = 0; (1 << h) < n; ++h) {
  96. for (int i = 0; i < n; ++i) {
  97. pn[i] = p[i] - (1 << h);
  98. if (pn[i] < 0) pn[i] += n;
  99. } //переход от первой степ 2ки ко 2ой степ 2ки
  100.  
  101. //memset(cnt, 0, classes * sizeof(int));
  102. for (int i = 0; i < n; ++i)
  103. ++cnt[c[pn[i]]];
  104. for (int i = 1; i < classes; ++i)
  105. cnt[i] += cnt[i - 1];
  106. for (int i = n - 1; i >= 0; --i)
  107. p[--cnt[c[pn[i]]]] = pn[i];
  108. cn[p[0]] = 0;
  109. classes = 1;
  110. for (int i = 1; i < n; ++i) {
  111. int mid1 = (p[i] + (1 << h)) % n, mid2 = (p[i - 1] + (1 << h)) % n;
  112. if (c[p[i]] != c[p[i - 1]] || c[mid1] != c[mid2])
  113. ++classes;
  114. cn[p[i]] = classes - 1;
  115. }
  116. //memcpy(c, cn, n * sizeof(int));
  117. std::cout << cn[0];
  118. }
  119. }
  120. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement