#include <bits/stdc++.h>
using namespace std;
vector<int32_t> getSuffixArray(string& str) {
vector<int32_t> ranks(str.size());
vector<int32_t> newranks(str.size());
for (int x = 0; x < str.size(); ++x)
newranks[x] = x;
sort(newranks.begin(), newranks.end(), [str](int32_t i, int32_t j) -> bool {
assert(i < str.size());
assert(j < str.size());
return str[i] < str[j];
});
cout << "here" << endl;
for (int x = 0; x < str.size(); ++x)
ranks[newranks[x]] = x;
for (int x = 1; x <= str.size(); x <<= 1) {
for (int y = 0; y < str.size(); ++y)
newranks[y] = y;
sort(newranks.begin(), newranks.end(), [&ranks, str, x](int32_t i, int32_t j) -> bool {
unsigned long long ki = 1ull*(ranks[i] + 1) << 32, kj = 1ull*(ranks[j] + 1) << 32;
if (i + x < str.size())
ki |= ranks[i + x] + 1;
if (j + x < str.size())
kj |= ranks[j + x] + 1;
return ki <= kj;
});
// cout << newranks << endl;
for (int x = 0; x < str.size(); ++x)
ranks[newranks[x]] = x;
}
return move(newranks);
}
int main() {
string str;
vector<int32_t> prtemp;
cin >> str;
prtemp = getSuffixArray(str);
// cout << prtemp << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50MzJfdD4gZ2V0U3VmZml4QXJyYXkoc3RyaW5nJiBzdHIpIHsKICAgIHZlY3RvcjxpbnQzMl90PiByYW5rcyhzdHIuc2l6ZSgpKTsKICAgIHZlY3RvcjxpbnQzMl90PiBuZXdyYW5rcyhzdHIuc2l6ZSgpKTsKICAgIGZvciAoaW50IHggPSAwOyB4IDwgc3RyLnNpemUoKTsgKyt4KQogICAgICAgIG5ld3JhbmtzW3hdID0geDsKICAgIHNvcnQobmV3cmFua3MuYmVnaW4oKSwgbmV3cmFua3MuZW5kKCksIFtzdHJdKGludDMyX3QgaSwgaW50MzJfdCBqKSAtPiBib29sIHsKICAgICAgICBhc3NlcnQoaSA8IHN0ci5zaXplKCkpOwogICAgICAgIGFzc2VydChqIDwgc3RyLnNpemUoKSk7CiAgICAgICAgcmV0dXJuIHN0cltpXSA8IHN0cltqXTsKICAgIH0pOwogICAgY291dCA8PCAiaGVyZSIgPDwgZW5kbDsKICAgIGZvciAoaW50IHggPSAwOyB4IDwgc3RyLnNpemUoKTsgKyt4KQogICAgICAgIHJhbmtzW25ld3JhbmtzW3hdXSA9IHg7CiAgICBmb3IgKGludCB4ID0gMTsgeCA8PSBzdHIuc2l6ZSgpOyB4IDw8PSAxKSB7CiAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBzdHIuc2l6ZSgpOyArK3kpCiAgICAgICAgICAgIG5ld3JhbmtzW3ldID0geTsKICAgICAgICBzb3J0KG5ld3JhbmtzLmJlZ2luKCksIG5ld3JhbmtzLmVuZCgpLCBbJnJhbmtzLCBzdHIsIHhdKGludDMyX3QgaSwgaW50MzJfdCBqKSAtPiBib29sIHsKICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGtpID0gMXVsbCoocmFua3NbaV0gKyAxKSA8PCAzMiwga2ogPSAxdWxsKihyYW5rc1tqXSArIDEpIDw8IDMyOwogICAgICAgICAgICBpZiAoaSArIHggPCBzdHIuc2l6ZSgpKQogICAgICAgICAgICAgICAga2kgfD0gcmFua3NbaSArIHhdICsgMTsKICAgICAgICAgICAgaWYgKGogKyB4IDwgc3RyLnNpemUoKSkKICAgICAgICAgICAgICAgIGtqIHw9IHJhbmtzW2ogKyB4XSArIDE7CiAgICAgICAgICAgIHJldHVybiBraSA8PSBrajsKICAgICAgICB9KTsKICAgICAgICAvLyBjb3V0IDw8IG5ld3JhbmtzIDw8IGVuZGw7CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBzdHIuc2l6ZSgpOyArK3gpCiAgICAgICAgICAgIHJhbmtzW25ld3JhbmtzW3hdXSA9IHg7CiAgICB9CiAgICByZXR1cm4gbW92ZShuZXdyYW5rcyk7Cn0KCmludCBtYWluKCkgewogICAgc3RyaW5nIHN0cjsKICAgIHZlY3RvcjxpbnQzMl90PiBwcnRlbXA7CiAgICBjaW4gPj4gc3RyOwogICAgcHJ0ZW1wID0gZ2V0U3VmZml4QXJyYXkoc3RyKTsKICAgIC8vIGNvdXQgPDwgcHJ0ZW1wIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQo=