#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> void SuffixArray( T * s, int N, int K, int * SA, int * LCP = NULL , void * mem = wmem) {
char * lms, * t;
int * cnt, * cnt1, * cnt2, d, i, j, m, name, pos, prev, * s1;
walloc1d( & t, N+ 1 , & mem) ;
walloc1d( & lms, N+ 1 , & mem) ;
walloc1d( & cnt, K+ 1 , & mem) ;
walloc1d( & cnt1, K+ 1 , & mem) ;
walloc1d( & cnt2, K+ 1 , & mem) ;
N++ ;
s[ N- 1 ] = 0 ;
t[ N- 1 ] = 1 ;
t[ N- 2 ] = 0 ;
for ( i= N- 3 ; i>= 0 ; i-- ) {
if ( s[ i] < s[ i+ 1 ] || ( s[ i] == s[ i+ 1 ] && t[ i+ 1 ] ) ) {
t[ i] = 1 ;
}
else {
t[ i] = 0 ;
}
}
lms[ 0 ] = 0 ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
if ( t[ i] && ! t[ i- 1 ] ) {
lms[ i] = 1 ;
}
else {
lms[ i] = 0 ;
}
}
for ( i= 0 ; i< ( K+ 1 ) ; i++ ) {
cnt1[ i] = 0 ;
}
for ( i= 0 ; i< ( N) ; i++ ) {
cnt1[ s[ i] ] ++ ;
}
j = 0 ;
for ( i= 0 ; i< ( K+ 1 ) ; i++ ) {
j + = cnt1[ i] ;
cnt2[ i] = j - cnt1[ i] ;
cnt1[ i] = j;
}
for ( i= 0 ; i< ( K+ 1 ) ; i++ ) {
cnt[ i] = cnt1[ i] ;
}
for ( i= 0 ; i< N; i++ ) {
SA[ i] = - 1 ;
}
for ( i= 1 ; i< N; i++ ) {
if ( lms[ i] ) {
SA[ -- cnt[ s[ i] ] ] = i;
}
}
for ( i= 0 ; i< ( K+ 1 ) ; i++ ) {
cnt[ i] = cnt2[ i] ;
}
for ( i= 0 ; i< ( N) ; i++ ) {
j = SA[ i] - 1 ;
if ( j>= 0 && ! t[ j] ) {
SA[ cnt[ s[ j] ] ++ ] = j;
}
}
for ( i= 0 ; i< ( K+ 1 ) ; i++ ) {
cnt[ i] = cnt1[ i] ;
}
for ( i= N- 1 ; i>= 0 ; i-- ) {
j = SA[ i] - 1 ;
if ( j>= 0 && t[ j] ) {
SA[ -- cnt[ s[ j] ] ] = j;
}
}
m = 0 ;
for ( i= 0 ; i< ( N) ; i++ ) {
if ( lms[ SA[ i] ] ) {
SA[ m++ ] = SA[ i] ;
}
}
for ( i= ( m) ; i< ( N) ; i++ ) {
SA[ i] = - 1 ;
}
name= 0 ;
prev= - 1 ;
for ( i= 0 ; i< ( m) ; i++ ) {
pos = SA[ i] ;
for ( d= 0 ; d< ( N) ; d++ ) {
if ( prev== - 1 || s[ pos+ d] ! = s[ prev+ d] || t[ pos+ d] ! = t[ prev+ d] ) {
name++ ;
prev= pos;
break ;
}
else if ( d> 0 && ( lms[ pos+ d] || lms[ prev+ d] ) ) {
break ;
}
}
pos / = 2 ;
SA[ m+ pos] = name- 1 ;
}
for ( i= N- 1 , j= N- 1 ; i>= m; i-- ) {
if ( SA[ i] >= 0 ) {
SA[ j-- ] = SA[ i] ;
}
}
s1 = SA+ N- m;
if ( name< m) {
SuffixArray( s1, m- 1 , name- 1 , SA, NULL , mem) ;
}
else {
for ( i= 0 ; i< m; i++ ) {
SA[ s1[ i] ] = i;
}
}
for ( i= 0 ; i< ( K+ 1 ) ; i++ ) {
cnt[ i] = cnt1[ i] ;
}
for ( i= 1 , j= 0 ; i< N; i++ ) {
if ( lms[ i] ) {
s1[ j++ ] = i;
}
}
for ( i= 0 ; i< m; i++ ) {
SA[ i] = s1[ SA[ i] ] ;
}
for ( i= m; i< N; i++ ) {
SA[ i] = - 1 ;
}
for ( i= m- 1 ; i>= 0 ; i-- ) {
j= SA[ i] ;
SA[ i] = - 1 ;
SA[ -- cnt[ s[ j] ] ] = j;
}
for ( i= 0 ; i< ( N) ; i++ ) {
j = SA[ i] - 1 ;
if ( j>= 0 && ! t[ j] ) {
SA[ cnt2[ s[ j] ] ++ ] = j;
}
}
for ( i= N- 1 ; i>= 0 ; i-- ) {
j = SA[ i] - 1 ;
if ( j>= 0 && t[ j] ) {
SA[ -- cnt1[ s[ j] ] ] = j;
}
}
if ( LCP ! = NULL ) {
cnt = ( int * ) t;
d = 0 ;
for ( i= 0 ; i< ( N) ; i++ ) {
cnt[ SA[ i] ] = i;
}
for ( i= 0 ; i< ( N) ; i++ ) {
if ( cnt[ i] ) {
for ( j= SA[ cnt[ i] - 1 ] ; j+ d< N- 1 && i+ d< N- 1 && s[ j+ d] == s[ i+ d] ; d++ ) {
;
}
LCP[ cnt[ i] ] = d;
}
else {
LCP[ cnt[ i] ] = - 1 ;
}
if ( d> 0 ) {
d-- ;
}
}
}
}
char memarr[ 96000000 ] ;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
char S[ 100001 ] ;
int SA[ 100001 ] ;
class Solution{
public :
string lastSubstring( string s) {
int N, i;
dummy_main( ) ;
N = s.size ( ) ;
for ( i= 0 ; i< ( N) ; i++ ) {
S[ i] = s[ i] ;
}
SuffixArray( S, N, 128 , SA) ;
return s.substr ( SA[ N] ) ;
}
}
;
// cLay varsion 20190820-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// char S[100001];
// int SA[100001];
//
// class Solution {
// public:
// string lastSubstring(string s) {
// dummy_main();
//
// int N;
// N = s.size();
// rep(i,N) S[i] = s[i];
// SuffixArray(S, N, 128, SA);
// return s.substr(SA[N]);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4LCB2b2lkICoqbWVtID0gJndtZW0pewogIHN0YXRpYyBpbnQgc2tpcFsxNl09ezAsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDF9OwogICgqbWVtKSA9ICh2b2lkKikoICgoY2hhciopKCptZW0pKSArIHNraXBbKCh1bnNpZ25lZCBsb25nIGxvbmcpKCptZW0pKSAmIDE1XSApOwogICgqYXJyKT0oVCopKCptZW0pOwogICgqbWVtKT0oKCphcnIpK3gpOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgU3VmZml4QXJyYXkoVCAqcywgaW50IE4sIGludCBLLCBpbnQgKlNBLCBpbnQgKkxDUCA9IE5VTEwsIHZvaWQgKm1lbSA9IHdtZW0pewogIGNoYXIgKmxtcywgKnQ7CiAgaW50ICpjbnQsICpjbnQxLCAqY250MiwgZCwgaSwgaiwgbSwgbmFtZSwgcG9zLCBwcmV2LCAqczE7CiAgd2FsbG9jMWQoJnQsIE4rMSwgJm1lbSk7CiAgd2FsbG9jMWQoJmxtcywgTisxLCAmbWVtKTsKICB3YWxsb2MxZCgmY250LCBLKzEsICZtZW0pOwogIHdhbGxvYzFkKCZjbnQxLCBLKzEsICZtZW0pOwogIHdhbGxvYzFkKCZjbnQyLCBLKzEsICZtZW0pOwogIE4rKzsKICBzW04tMV0gPSAwOwogIHRbTi0xXSA9IDE7CiAgdFtOLTJdID0gMDsKICBmb3IoaT1OLTM7aT49MDtpLS0pewogICAgaWYoc1tpXSA8IHNbaSsxXSB8fCAoc1tpXT09c1tpKzFdICYmIHRbaSsxXSkpewogICAgICB0W2ldID0gMTsKICAgIH0KICAgIGVsc2V7CiAgICAgIHRbaV0gPSAwOwogICAgfQogIH0KICBsbXNbMF0gPSAwOwogIGZvcihpPSgxKTtpPChOKTtpKyspewogICAgaWYodFtpXSAmJiAhdFtpLTFdKXsKICAgICAgbG1zW2ldID0gMTsKICAgIH0KICAgIGVsc2V7CiAgICAgIGxtc1tpXSA9IDA7CiAgICB9CiAgfQogIGZvcihpPTA7aTwoSysxKTtpKyspewogICAgY250MVtpXSA9IDA7CiAgfQogIGZvcihpPTA7aTwoTik7aSsrKXsKICAgIGNudDFbc1tpXV0rKzsKICB9CiAgaiA9IDA7CiAgZm9yKGk9MDtpPChLKzEpO2krKyl7CiAgICBqICs9IGNudDFbaV07CiAgICBjbnQyW2ldID0gaiAtIGNudDFbaV07CiAgICBjbnQxW2ldID0gajsKICB9CiAgZm9yKGk9MDtpPChLKzEpO2krKyl7CiAgICBjbnRbaV0gPSBjbnQxW2ldOwogIH0KICBmb3IoaT0wOyBpPE47IGkrKyl7CiAgICBTQVtpXSA9IC0xOwogIH0KICBmb3IoaT0xOyBpPE47IGkrKyl7CiAgICBpZihsbXNbaV0pewogICAgICBTQVstLWNudFtzW2ldXV09aTsKICAgIH0KICB9CiAgZm9yKGk9MDtpPChLKzEpO2krKyl7CiAgICBjbnRbaV0gPSBjbnQyW2ldOwogIH0KICBmb3IoaT0wO2k8KE4pO2krKyl7CiAgICBqID0gU0FbaV0tMTsKICAgIGlmKGo+PTAgJiYgIXRbal0pewogICAgICBTQVtjbnRbc1tqXV0rK10gPSBqOwogICAgfQogIH0KICBmb3IoaT0wO2k8KEsrMSk7aSsrKXsKICAgIGNudFtpXSA9IGNudDFbaV07CiAgfQogIGZvcihpPU4tMTtpPj0wO2ktLSl7CiAgICBqID0gU0FbaV0gLSAxOwogICAgaWYoaj49MCAmJiB0W2pdKXsKICAgICAgU0FbLS1jbnRbc1tqXV1dID0gajsKICAgIH0KICB9CiAgbSA9IDA7CiAgZm9yKGk9MDtpPChOKTtpKyspewogICAgaWYobG1zW1NBW2ldXSl7CiAgICAgIFNBW20rK10gPSBTQVtpXTsKICAgIH0KICB9CiAgZm9yKGk9KG0pO2k8KE4pO2krKyl7CiAgICBTQVtpXSA9IC0xOwogIH0KICBuYW1lPTA7CiAgcHJldj0tMTsKICBmb3IoaT0wO2k8KG0pO2krKyl7CiAgICBwb3MgPSBTQVtpXTsKICAgIGZvcihkPTA7ZDwoTik7ZCsrKXsKICAgICAgaWYocHJldj09LTEgfHwgc1twb3MrZF0hPXNbcHJlditkXSB8fCB0W3BvcytkXSE9dFtwcmV2K2RdKXsKICAgICAgICBuYW1lKys7CiAgICAgICAgcHJldj1wb3M7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZWxzZSBpZihkPjAgJiYgKGxtc1twb3MrZF0gfHwgbG1zW3ByZXYrZF0pKXsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcG9zIC89IDI7CiAgICBTQVttK3Bvc109bmFtZS0xOwogIH0KICBmb3IoaT1OLTEsIGo9Ti0xOyBpPj1tOyBpLS0pewogICAgaWYoU0FbaV0+PTApewogICAgICBTQVtqLS1dPVNBW2ldOwogICAgfQogIH0KICBzMSA9IFNBK04tbTsKICBpZihuYW1lPG0pewogICAgU3VmZml4QXJyYXkoczEsIG0tMSwgbmFtZS0xLCBTQSwgTlVMTCwgbWVtKTsKICB9CiAgZWxzZXsKICAgIGZvcihpPTA7IGk8bTsgaSsrKXsKICAgICAgU0FbczFbaV1dID0gaTsKICAgIH0KICB9CiAgZm9yKGk9MDtpPChLKzEpO2krKyl7CiAgICBjbnRbaV0gPSBjbnQxW2ldOwogIH0KICBmb3IoaT0xLCBqPTA7IGk8TjsgaSsrKXsKICAgIGlmKGxtc1tpXSl7CiAgICAgIHMxW2orK109aTsKICAgIH0KICB9CiAgZm9yKGk9MDsgaTxtOyBpKyspewogICAgU0FbaV09czFbU0FbaV1dOwogIH0KICBmb3IoaT1tOyBpPE47IGkrKyl7CiAgICBTQVtpXT0tMTsKICB9CiAgZm9yKGk9bS0xOyBpPj0wOyBpLS0pewogICAgaj1TQVtpXTsKICAgIFNBW2ldPS0xOwogICAgU0FbLS1jbnRbc1tqXV1dPWo7CiAgfQogIGZvcihpPTA7aTwoTik7aSsrKXsKICAgIGogPSBTQVtpXS0xOwogICAgaWYoaj49MCAmJiAhdFtqXSl7CiAgICAgIFNBW2NudDJbc1tqXV0rK10gPSBqOwogICAgfQogIH0KICBmb3IoaT1OLTE7aT49MDtpLS0pewogICAgaiA9IFNBW2ldIC0gMTsKICAgIGlmKGo+PTAgJiYgdFtqXSl7CiAgICAgIFNBWy0tY250MVtzW2pdXV0gPSBqOwogICAgfQogIH0KICBpZihMQ1AgIT0gTlVMTCl7CiAgICBjbnQgPSAoaW50Kil0OwogICAgZCA9IDA7CiAgICBmb3IoaT0wO2k8KE4pO2krKyl7CiAgICAgIGNudFtTQVtpXV0gPSBpOwogICAgfQogICAgZm9yKGk9MDtpPChOKTtpKyspewogICAgICBpZihjbnRbaV0pewogICAgICAgIGZvcihqPVNBW2NudFtpXS0xXTsgaitkPE4tMSYmaStkPE4tMSYmc1tqK2RdPT1zW2krZF07ZCsrKXsKICAgICAgICAgIDsKICAgICAgICB9CiAgICAgICAgTENQW2NudFtpXV09ZDsKICAgICAgfQogICAgICBlbHNlewogICAgICAgIExDUFtjbnRbaV1dID0gLTE7CiAgICAgIH0KICAgICAgaWYoZD4wKXsKICAgICAgICBkLS07CiAgICAgIH0KICAgIH0KICB9Cn0KY2hhciBtZW1hcnJbOTYwMDAwMDBdOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHdtZW0gPSBtZW1hcnI7CiAgcmV0dXJuIDA7Cn0KI3VuZGVmIG1haW4KY2hhciBTWzEwMDAwMV07CmludCBTQVsxMDAwMDFdOwpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgc3RyaW5nIGxhc3RTdWJzdHJpbmcoc3RyaW5nIHMpewogICAgaW50IE4sIGk7CiAgICBkdW1teV9tYWluKCk7CiAgICBOID0gcy5zaXplKCk7CiAgICBmb3IoaT0wO2k8KE4pO2krKyl7CiAgICAgIFNbaV0gPSBzW2ldOwogICAgfQogICAgU3VmZml4QXJyYXkoUywgTiwgMTI4LCBTQSk7CiAgICByZXR1cm4gcy5zdWJzdHIoU0FbTl0pOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDE5MDgyMC0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGNoYXIgU1sxMDAwMDFdOwovLyBpbnQgU0FbMTAwMDAxXTsKLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIHN0cmluZyBsYXN0U3Vic3RyaW5nKHN0cmluZyBzKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vIAovLyAgICAgaW50IE47Ci8vICAgICBOID0gcy5zaXplKCk7Ci8vICAgICByZXAoaSxOKSBTW2ldID0gc1tpXTsKLy8gICAgIFN1ZmZpeEFycmF5KFMsIE4sIDEyOCwgU0EpOwovLyAgICAgcmV0dXJuIHMuc3Vic3RyKFNBW05dKTsKLy8gICB9Ci8vIH07Cg==