fork 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. auto AR = std::get<0>(A[i]);
  32. auto BR = std::get<0>(B[i]);
  33. A = B = DD;
  34. return std::isgreater(AR, BR);
  35. }
  36. }
  37. A = B = DD;
  38. return false;
  39. });
  40.  
  41. DType R;
  42. std::size_t L=0;
  43.  
  44. for (std::size_t i = 0; i < D.size(); i++) {
  45. R.push_back(std::get<0>(D[i]));
  46. if (std::get<1>(D[i]) == 0) { L = i+1; }
  47. }
  48.  
  49. std::rotate(R.begin(), R.end() - (L % R.size()), R.end());
  50.  
  51. return { R,L };
  52.  
  53. }
  54.  
  55. DType MakeCacao() {
  56. DType R = { 'c','a','c','a','o'};
  57.  
  58. return R;
  59. }
  60.  
  61. DType MakeVecor(std::size_t L, unsigned int S = 0) {
  62. DType R;
  63. std::mt19937 mt(S);
  64. std::uniform_int_distribution<int> ui(0, 255);
  65. for (std::size_t i = 0; i < L; i++) {
  66. R.push_back(ui(mt));
  67. }
  68.  
  69. return R;
  70. }
  71. DType MakeVecor2(std::size_t L, unsigned int S = 0) {
  72. DType R;
  73. std::mt19937 mt(S);
  74. std::uniform_int_distribution<int> ui('A', 'z');
  75. for (std::size_t i = 0; i < L; i++) {
  76. R.push_back(ui(mt));
  77. }
  78.  
  79. return R;
  80. }
  81.  
  82. bool Show(const DType& In) {
  83. for (auto& o : In) {
  84. std::cout << o << ',';
  85. }
  86.  
  87. std::cout << std::endl;
  88.  
  89. return true;
  90. }
  91. int main() {
  92. //auto D = MakeCacao();
  93.  
  94. //auto D = MakeVecor2(16);
  95. auto D = MakeVecor2(128);
  96. Show(D);
  97.  
  98. auto A = BlockSort_Enc(D);
  99.  
  100. Show(std::get<0>(A));
  101.  
  102. return 0;
  103.  
  104.  
  105.  
  106. }
Success #stdin #stdout 0.01s 5544KB
stdin
Standard input is empty
stdout
`,c,j,q,c,r,`,r,Y,e,f,W,Z,R,t,D,x,P,W,\,n,p,_,\,a,W,v,q,E,T,F,f,B,V,q,x,n,I,s,s,y,\,o,o,[,_,n,h,G,j,f,b,I,`,w,l,_,G,Y,\,P,K,m,k,[,M,a,H,B,S,d,I,d,M,d,W,w,u,h,[,U,d,Z,u,i,F,D,y,g,f,g,J,M,U,H,l,S,d,V,S,b,C,Z,e,z,x,F,f,M,e,J,z,f,b,O,Y,\,\,O,e,J,T,G,h,g,S,I,n,
`,`,_,_,_,\,\,\,\,\,\,[,[,[,Z,Z,Z,Y,Y,Y,W,W,W,W,V,V,U,U,T,T,S,S,S,S,R,P,P,O,O,M,M,M,M,K,J,J,J,I,I,I,I,H,H,G,G,G,F,F,F,E,D,D,C,B,B,z,z,y,y,x,x,x,w,w,v,u,u,t,s,s,r,r,q,q,q,p,o,o,n,n,n,n,m,l,l,k,j,j,i,h,h,h,g,g,g,f,f,f,f,f,f,e,e,e,e,d,d,d,d,d,c,c,b,b,b,a,a,`,