fork(1) download
  1. #include <iostream>
  2. #include <cstdint>
  3. #include <vector>
  4. #include <algorithm>
  5. #include <tuple>
  6. #include <random>
  7.  
  8. typedef std::uint8_t Word;
  9. typedef std::vector<Word> DType;
  10. typedef std::vector<DType> DTypes;
  11. typedef std::tuple<DType, std::size_t> Data;
  12.  
  13. Data BlockSort_Enc(const DType& In) {
  14. std::vector<std::tuple<Word, std::size_t>> D;
  15.  
  16. for (std::size_t i = 0; i < In.size(); i++) {
  17. D.push_back({ In[i],i });
  18. }
  19.  
  20. auto DD = D;
  21. auto A = D;
  22. auto B = D;
  23. auto& X = D;
  24.  
  25. std::stable_sort(D.begin(), D.end(), [&](auto& AA, auto& BB) {
  26. std::rotate(A.begin(), A.begin() + (std::get<1>(AA)%A.size()), A.end());
  27. std::rotate(B.begin(), B.begin() + (std::get<1>(BB)%B.size()), B.end());
  28.  
  29. for (std::size_t i = 0; i < X.size(); i++) {
  30. if (std::get<0>(A[i]) != std::get<0>(B[i])) {
  31. return std::isgreater(std::get<0>(A[i]), std::get<0>(B[i]));
  32. }
  33. }
  34. A = B = DD;
  35. return false;
  36. });
  37.  
  38. DType R;
  39. std::size_t L=0;
  40.  
  41. for (std::size_t i = 0; i < D.size(); i++) {
  42. R.push_back(std::get<0>(D[i]));
  43. if (std::get<1>(D[i]) == 0) { L = i+1; }
  44. }
  45.  
  46. std::rotate(R.begin(), R.end() - (L % R.size()), R.end());
  47.  
  48. return { R,L };
  49.  
  50. }
  51.  
  52. DType MakeCacao() {
  53. DType R = { 'c','a','c','a','o'};
  54.  
  55. return R;
  56. }
  57.  
  58. DType MakeVecor(std::size_t L, unsigned int S = 0) {
  59. DType R;
  60. std::mt19937 mt(S);
  61. std::uniform_int_distribution<int> ui(0, 255);
  62. for (std::size_t i = 0; i < L; i++) {
  63. R.push_back(ui(mt));
  64. }
  65.  
  66. return R;
  67. }
  68. DType MakeVecor2(std::size_t L, unsigned int S = 0) {
  69. DType R;
  70. std::mt19937 mt(S);
  71. std::uniform_int_distribution<int> ui('A', 'z');
  72. for (std::size_t i = 0; i < L; i++) {
  73. R.push_back(ui(mt));
  74. }
  75.  
  76. return R;
  77. }
  78.  
  79. bool Show(const DType& In) {
  80. for (auto& o : In) {
  81. std::cout << o << ',';
  82. }
  83.  
  84. std::cout << std::endl;
  85.  
  86. return true;
  87. }
  88. int main() {
  89. //auto D = MakeCacao();
  90.  
  91. //auto D = MakeVecor2(16);
  92. auto D = MakeVecor2(16);
  93. Show(D);
  94.  
  95. auto A = BlockSort_Enc(D);
  96.  
  97. Show(std::get<0>(A));
  98.  
  99. return 0;
  100.  
  101.  
  102.  
  103. }
Success #stdin #stdout 0.01s 5472KB
stdin
Standard input is empty
stdout
`,c,j,q,c,r,`,r,Y,e,f,W,Z,R,t,D,
D,r,W,f,e,Y,t,j,R,c,c,`,q,`,r,Z,