#include <bits/stdc++.h>
using namespace std;
string lastSubstring(string s) {
int N = s.size(), startIdx = N;
vector<int> cons(N, 1);
function<bool(int, int)> check;
check = [&](int fIdx, int sIdx){
if(sIdx == N) return true;
if(s[fIdx] != s[sIdx]) return s[fIdx] > s[sIdx]; // x.... > a....
if(cons[fIdx] == cons[sIdx]){
return check(fIdx + cons[fIdx], sIdx + cons[sIdx]);
// xxx + Y && xxx + Z --> compare Y & Z
}
if(cons[fIdx] > cons[sIdx]) return true; // xxx.... > xx...
return false; // xx... < xxx....
};
for(int idx = N - 2; idx >= 0; --idx) if(s[idx] == s[idx + 1]) cons[idx] += cons[idx + 1];
for(int idx = N - 1; idx >= 0; --idx){
if(check(idx, startIdx)){
startIdx = idx;
}
}
return s.substr(startIdx);
}
int main() {
cout << lastSubstring("leettcodtte");
// cons array for leettcodtte is [1,2,1,2,1,1,1,1,2,1,1]
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKc3RyaW5nIGxhc3RTdWJzdHJpbmcoc3RyaW5nIHMpIHsKICAgIGludCBOID0gcy5zaXplKCksIHN0YXJ0SWR4ID0gTjsKICAgIHZlY3RvcjxpbnQ+IGNvbnMoTiwgMSk7CiAgICAKICAgIGZ1bmN0aW9uPGJvb2woaW50LCBpbnQpPiBjaGVjazsKICAgIGNoZWNrID0gWyZdKGludCBmSWR4LCBpbnQgc0lkeCl7CiAgICAgICAgaWYoc0lkeCA9PSBOKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZihzW2ZJZHhdICE9IHNbc0lkeF0pIHJldHVybiBzW2ZJZHhdID4gc1tzSWR4XTsgLy8geC4uLi4gPiBhLi4uLgogICAgICAgIGlmKGNvbnNbZklkeF0gPT0gY29uc1tzSWR4XSl7CiAgICAgICAgICAgIHJldHVybiBjaGVjayhmSWR4ICsgY29uc1tmSWR4XSwgc0lkeCArIGNvbnNbc0lkeF0pOwogICAgICAgICAgICAvLyB4eHggKyBZICYmIHh4eCArIFogLS0+IGNvbXBhcmUgWSAmIFoKICAgICAgICB9CiAgICAgICAgaWYoY29uc1tmSWR4XSA+IGNvbnNbc0lkeF0pIHJldHVybiB0cnVlOyAvLyB4eHguLi4uID4geHguLi4KICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHh4Li4uIDwgeHh4Li4uLgogICAgfTsKICAgIAogICAgZm9yKGludCBpZHggPSBOIC0gMjsgaWR4ID49IDA7IC0taWR4KSBpZihzW2lkeF0gPT0gc1tpZHggKyAxXSkgY29uc1tpZHhdICs9IGNvbnNbaWR4ICsgMV07CiAgICAKICAgIGZvcihpbnQgaWR4ID0gTiAtIDE7IGlkeCA+PSAwOyAtLWlkeCl7CiAgICAgICAgaWYoY2hlY2soaWR4LCBzdGFydElkeCkpewogICAgICAgICAgICBzdGFydElkeCA9IGlkeDsKICAgICAgICB9CiAgICB9CiAgICAKICAgIHJldHVybiBzLnN1YnN0cihzdGFydElkeCk7CiAgICAKfQoKaW50IG1haW4oKSB7Cgljb3V0IDw8IGxhc3RTdWJzdHJpbmcoImxlZXR0Y29kdHRlIik7CgkvLyBjb25zIGFycmF5IGZvciBsZWV0dGNvZHR0ZSBpcyBbMSwyLDEsMiwxLDEsMSwxLDIsMSwxXQoJcmV0dXJuIDA7Cn0=