#include <iostream>
#include <cstdint>
#include <vector>
#include <algorithm>
#include <tuple>
#include <random>
typedef std::uint8_t Word;
typedef std::vector<Word> DType;
typedef std::vector<DType> DTypes;
typedef std::tuple<DType, std::size_t> Data;
Data BlockSort_Enc(const DType& In) {
std::vector<std::tuple<Word, std::size_t>> D;
for (std::size_t i = 0; i < In.size(); i++) {
D.push_back({ In[i],i });
}
auto DD = D;
auto A = D;
auto B = D;
auto& X = D;
std::stable_sort(D.begin(), D.end(), [&](auto& AA, auto& BB) {
std::rotate(A.begin(), A.begin() + (std::get<1>(AA)%A.size()), A.end());
std::rotate(B.begin(), B.begin() + (std::get<1>(BB)%B.size()), B.end());
for (std::size_t i = 0; i < X.size(); i++) {
if (std::get<0>(A[i]) != std::get<0>(B[i])) {
return std::isgreater(std::get<0>(A[i]), std::get<0>(B[i]));
}
}
A = B = DD;
return false;
});
DType R;
std::size_t L=0;
for (std::size_t i = 0; i < D.size(); i++) {
R.push_back(std::get<0>(D[i]));
if (std::get<1>(D[i]) == 0) { L = i+1; }
}
std::rotate(R.begin(), R.end() - (L % R.size()), R.end());
return { R,L };
}
DType MakeCacao() {
DType R = { 'c','a','c','a','o'};
return R;
}
DType MakeVecor(std::size_t L, unsigned int S = 0) {
DType R;
std::mt19937 mt(S);
std::uniform_int_distribution<int> ui(0, 255);
for (std::size_t i = 0; i < L; i++) {
R.push_back(ui(mt));
}
return R;
}
DType MakeVecor2(std::size_t L, unsigned int S = 0) {
DType R;
std::mt19937 mt(S);
std::uniform_int_distribution<int> ui('A', 'z');
for (std::size_t i = 0; i < L; i++) {
R.push_back(ui(mt));
}
return R;
}
bool Show(const DType& In) {
for (auto& o : In) {
std::cout << o << ',';
}
std::cout << std::endl;
return true;
}
int main() {
//auto D = MakeCacao();
//auto D = MakeVecor2(16);
auto D = MakeVecor2(16);
Show(D);
auto A = BlockSort_Enc(D);
Show(std::get<0>(A));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8cmFuZG9tPgoKdHlwZWRlZiBzdGQ6OnVpbnQ4X3QgV29yZDsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxXb3JkPiBEVHlwZTsKdHlwZWRlZiBzdGQ6OnZlY3RvcjxEVHlwZT4gRFR5cGVzOwp0eXBlZGVmIHN0ZDo6dHVwbGU8RFR5cGUsIHN0ZDo6c2l6ZV90PiBEYXRhOwoKRGF0YSBCbG9ja1NvcnRfRW5jKGNvbnN0IERUeXBlJiBJbikgewoJc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxXb3JkLCBzdGQ6OnNpemVfdD4+IEQ7CgoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEluLnNpemUoKTsgaSsrKSB7CgkJRC5wdXNoX2JhY2soeyBJbltpXSxpIH0pOwoJfQoKCWF1dG8gREQgPSBEOwoJYXV0byBBID0gRDsKCWF1dG8gQiA9IEQ7CglhdXRvJiBYID0gRDsKCglzdGQ6OnN0YWJsZV9zb3J0KEQuYmVnaW4oKSwgRC5lbmQoKSwgWyZdKGF1dG8mIEFBLCBhdXRvJiBCQikgewoJCXN0ZDo6cm90YXRlKEEuYmVnaW4oKSwgQS5iZWdpbigpICsgKHN0ZDo6Z2V0PDE+KEFBKSVBLnNpemUoKSksIEEuZW5kKCkpOwoJCXN0ZDo6cm90YXRlKEIuYmVnaW4oKSwgQi5iZWdpbigpICsgKHN0ZDo6Z2V0PDE+KEJCKSVCLnNpemUoKSksIEIuZW5kKCkpOwoKCQlmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgWC5zaXplKCk7IGkrKykgewoJCQlpZiAoc3RkOjpnZXQ8MD4oQVtpXSkgIT0gc3RkOjpnZXQ8MD4oQltpXSkpIHsKCQkJCXJldHVybiBzdGQ6OmlzZ3JlYXRlcihzdGQ6OmdldDwwPihBW2ldKSwgc3RkOjpnZXQ8MD4oQltpXSkpOwoJCQl9CgkJfQoJCUEgPSBCID0gREQ7CgkJcmV0dXJuIGZhbHNlOwoJfSk7CgoJRFR5cGUgUjsKCXN0ZDo6c2l6ZV90IEw9MDsKCglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRC5zaXplKCk7IGkrKykgewoJCVIucHVzaF9iYWNrKHN0ZDo6Z2V0PDA+KERbaV0pKTsKCQlpZiAoc3RkOjpnZXQ8MT4oRFtpXSkgPT0gMCkgeyBMID0gaSsxOyB9Cgl9CgoJc3RkOjpyb3RhdGUoUi5iZWdpbigpLCBSLmVuZCgpIC0gKEwgJSBSLnNpemUoKSksIFIuZW5kKCkpOwoKCXJldHVybiB7IFIsTCB9OwoKfQoKRFR5cGUgTWFrZUNhY2FvKCkgewoJRFR5cGUgUiA9IHsgJ2MnLCdhJywnYycsJ2EnLCdvJ307CgoJcmV0dXJuIFI7Cn0KCkRUeXBlIE1ha2VWZWNvcihzdGQ6OnNpemVfdCBMLCB1bnNpZ25lZCBpbnQgUyA9IDApIHsKCURUeXBlIFI7CglzdGQ6Om10MTk5MzcgbXQoUyk7CglzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IHVpKDAsIDI1NSk7Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgTDsgaSsrKSB7CgkJUi5wdXNoX2JhY2sodWkobXQpKTsKCX0KCglyZXR1cm4gUjsKfQpEVHlwZSBNYWtlVmVjb3IyKHN0ZDo6c2l6ZV90IEwsIHVuc2lnbmVkIGludCBTID0gMCkgewoJRFR5cGUgUjsKCXN0ZDo6bXQxOTkzNyBtdChTKTsKCXN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gdWkoJ0EnLCAneicpOwoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEw7IGkrKykgewoJCVIucHVzaF9iYWNrKHVpKG10KSk7Cgl9CgoJcmV0dXJuIFI7Cn0KCmJvb2wgU2hvdyhjb25zdCBEVHlwZSYgSW4pIHsKCWZvciAoYXV0byYgbyA6IEluKSB7CgkJc3RkOjpjb3V0IDw8IG8gPDwgJywnOwoJfQoKCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CgoJcmV0dXJuIHRydWU7Cn0KaW50IG1haW4oKSB7CgkvL2F1dG8gRCA9IE1ha2VDYWNhbygpOwoKCS8vYXV0byBEID0gTWFrZVZlY29yMigxNik7CglhdXRvIEQgPSBNYWtlVmVjb3IyKDE2KTsKCVNob3coRCk7CgoJYXV0byBBID0gQmxvY2tTb3J0X0VuYyhEKTsKCglTaG93KHN0ZDo6Z2V0PDA+KEEpKTsKCglyZXR1cm4gMDsKCQoKCn0=
`,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,