#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class S, class T> inline S min_L( S a,T b) {
return a<= b? a: b;
}
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> int longestSuffixPrefix( int As, T A[ ] , int Bs, T B[ ] , void * mem = wmem) {
int i;
int k;
int res;
int * fail;
if ( As > Bs) {
A + = As- Bs;
As = Bs;
}
if ( As < Bs) {
Bs = As;
}
walloc1d( & fail, Bs, & mem) ;
k = fail[ 0 ] = - 1 ;
for ( i= ( 0 ) ; i< ( Bs) ; i++ ) {
while ( k>= 0 && B[ k] ! = B[ i] ) {
k = fail[ k] ;
}
fail[ i+ 1 ] = ++ k;
}
res = 0 ;
for ( i= ( 0 ) ; i< ( As) ; i++ ) {
while ( res && A[ i] ! = B[ res] ) {
res = fail[ res] ;
}
if ( A[ i] == B[ res] ) {
res++ ;
}
}
return res;
}
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
class Solution{
public :
string longestPrefix( string s) {
dummy_main( ) ;
int len = longestSuffixPrefix( s.size ( ) - 1 , s.c_str ( ) + 1 , s.size ( ) - 1 , s.c_str ( ) ) ;
return s.substr ( 0 ,len) ;
}
}
;
// cLay varsion 20200325-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// class Solution {
// public:
// string longestPrefix(string s) {
// dummy_main();
// int len = longestSuffixPrefix(s.size()-1, s.c_str()+1, s.size()-1, s.c_str());
// return s.substr(0,len);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnZvaWQgKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgUywgY2xhc3MgVD4gaW5saW5lIFMgbWluX0woUyBhLFQgYil7CiAgcmV0dXJuIGE8PWI/YTpiOwp9CnRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSB2b2lkIHdhbGxvYzFkKFQgKiphcnIsIGludCB4LCB2b2lkICoqbWVtID0gJndtZW0pewogIHN0YXRpYyBpbnQgc2tpcFsxNl0gPSB7MCwgMTUsIDE0LCAxMywgMTIsIDExLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMX07CiAgKCptZW0pID0gKHZvaWQqKSggKChjaGFyKikoKm1lbSkpICsgc2tpcFsoKHVuc2lnbmVkIGxvbmcgbG9uZykoKm1lbSkpICYgMTVdICk7CiAgKCphcnIpPShUKikoKm1lbSk7CiAgKCptZW0pPSgoKmFycikreCk7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW50IGxvbmdlc3RTdWZmaXhQcmVmaXgoaW50IEFzLCBUIEFbXSwgaW50IEJzLCBUIEJbXSwgdm9pZCAqbWVtID0gd21lbSl7CiAgaW50IGk7CiAgaW50IGs7CiAgaW50IHJlczsKICBpbnQgKmZhaWw7CiAgaWYoQXMgPiBCcyl7CiAgICBBICs9IEFzLUJzOwogICAgQXMgPSBCczsKICB9CiAgaWYoQXMgPCBCcyl7CiAgICBCcyA9IEFzOwogIH0KICB3YWxsb2MxZCgmZmFpbCwgQnMsICZtZW0pOwogIGsgPSBmYWlsWzBdID0gLTE7CiAgZm9yKGk9KDApO2k8KEJzKTtpKyspewogICAgd2hpbGUoaz49MCAmJiBCW2tdIT1CW2ldKXsKICAgICAgayA9IGZhaWxba107CiAgICB9CiAgICBmYWlsW2krMV0gPSArK2s7CiAgfQogIHJlcyA9IDA7CiAgZm9yKGk9KDApO2k8KEFzKTtpKyspewogICAgd2hpbGUocmVzICYmIEFbaV0hPUJbcmVzXSl7CiAgICAgIHJlcyA9IGZhaWxbcmVzXTsKICAgIH0KICAgIGlmKEFbaV09PUJbcmVzXSl7CiAgICAgIHJlcysrOwogICAgfQogIH0KICByZXR1cm4gcmVzOwp9CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpjbGFzcyBTb2x1dGlvbnsKICBwdWJsaWM6CiAgc3RyaW5nIGxvbmdlc3RQcmVmaXgoc3RyaW5nIHMpewogICAgZHVtbXlfbWFpbigpOwogICAgaW50IGxlbiA9IGxvbmdlc3RTdWZmaXhQcmVmaXgocy5zaXplKCktMSwgcy5jX3N0cigpKzEsIHMuc2l6ZSgpLTEsIHMuY19zdHIoKSk7CiAgICByZXR1cm4gcy5zdWJzdHIoMCxsZW4pOwogIH0KfQo7Ci8vIGNMYXkgdmFyc2lvbiAyMDIwMDMyNS0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGNsYXNzIFNvbHV0aW9uIHsKLy8gcHVibGljOgovLyAgIHN0cmluZyBsb25nZXN0UHJlZml4KHN0cmluZyBzKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vICAgICBpbnQgbGVuID0gbG9uZ2VzdFN1ZmZpeFByZWZpeChzLnNpemUoKS0xLCBzLmNfc3RyKCkrMSwgcy5zaXplKCktMSwgcy5jX3N0cigpKTsKLy8gICAgIHJldHVybiBzLnN1YnN0cigwLGxlbik7Ci8vICAgfQovLyB9Owo=