#include <bits/stdc++.h>
using namespace std;
char next[100000];
void compute_next(string &s)
{
int slen = s.size();
next[0] = 0; /* initially next[q] = 0, first character in pattern */
int k = 0; /* no of char matched so far */
int q = 1;
while( q < slen )
{
while( k > 0 && s[k] != s[q] ) {
k = next[k-1];
}
if(s[k] == s[q])
k=k+1;
next[q] = k;
q++;
}
}
int kmp_match(string &s, string &p)
{
int slen = s.size();
/* calculate the next function on input string */
compute_next(p);
int q = 0; /* no of char matched so far */
int ind = 0, m = 0;
while(ind < slen) {
while(q > 0 && p[q] != s[ind])
q = next[q-1]; /* if char doesn't match, shift by taking value from next array */
if(p[q] == s[ind])
q = q+1; /* if matches, shift by 1, higher the q, longer the match */
m = max(m,q);
ind++;
}
/* return number of char matches so far */
return q;
}
bool is_palin(string &s)
{
int len = s.size();
if( len < 2 ) return true;
for( int i = 0; i < (int)len/2; ++i)
{
if( s[i] != s[len-i-1])
return false;
}
return true;
}
string reverse(const string &s)
{
int sz = s.size();
string rev;
for(int i = 0; i < sz; ++i)
rev += s[sz-i-1];
rev.resize(sz);
return rev;
}
int main()
{
string line;
while(cin >> line)
{
if(is_palin(line))
{
cout << line << endl;
}
else
{
string rev = reverse(line);
int index = kmp_match(line, rev);
cout << line << rev.substr(index, rev.size()-1) << endl;
}
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNoYXIgbmV4dFsxMDAwMDBdOwp2b2lkIGNvbXB1dGVfbmV4dChzdHJpbmcgJnMpCnsKICBpbnQgc2xlbiA9IHMuc2l6ZSgpOwogIG5leHRbMF0gPSAwOyAvKiBpbml0aWFsbHkgbmV4dFtxXSA9IDAsIGZpcnN0IGNoYXJhY3RlciBpbiBwYXR0ZXJuICovCiAgaW50IGsgPSAwOyAvKiBubyBvZiBjaGFyIG1hdGNoZWQgc28gZmFyICovCiAgaW50IHEgPSAxOwogIHdoaWxlKCBxIDwgc2xlbiApCiAgewogICAgd2hpbGUoIGsgPiAwICYmIHNba10gIT0gc1txXSApIHsKICAgICAgayA9IG5leHRbay0xXTsKICAgIH0KICAgIGlmKHNba10gPT0gc1txXSkKICAgICAgaz1rKzE7CiAgICBuZXh0W3FdID0gazsKICAgIHErKzsKICB9Cn0KCmludCBrbXBfbWF0Y2goc3RyaW5nICZzLCBzdHJpbmcgJnApCnsKICBpbnQgc2xlbiA9IHMuc2l6ZSgpOwogIC8qIGNhbGN1bGF0ZSB0aGUgbmV4dCBmdW5jdGlvbiBvbiBpbnB1dCBzdHJpbmcgKi8KICBjb21wdXRlX25leHQocCk7CiAgaW50IHEgPSAwOyAvKiBubyBvZiBjaGFyIG1hdGNoZWQgc28gZmFyICovCiAgaW50IGluZCA9IDAsIG0gPSAwOwogIHdoaWxlKGluZCA8IHNsZW4pIHsKICAgIHdoaWxlKHEgPiAwICYmIHBbcV0gIT0gc1tpbmRdKQogICAgICBxID0gbmV4dFtxLTFdOyAvKiBpZiBjaGFyIGRvZXNuJ3QgbWF0Y2gsIHNoaWZ0IGJ5IHRha2luZyB2YWx1ZSBmcm9tIG5leHQgYXJyYXkgKi8KICAgIGlmKHBbcV0gPT0gc1tpbmRdKQogICAgICBxID0gcSsxOyAvKiBpZiBtYXRjaGVzLCBzaGlmdCBieSAxLCBoaWdoZXIgdGhlIHEsIGxvbmdlciB0aGUgbWF0Y2ggKi8KICAgIG0gPSBtYXgobSxxKTsKICAgIGluZCsrOwogIH0KICAvKiByZXR1cm4gbnVtYmVyIG9mIGNoYXIgbWF0Y2hlcyBzbyBmYXIgKi8KICByZXR1cm4gcTsKfQpib29sIGlzX3BhbGluKHN0cmluZyAmcykKewogICBpbnQgbGVuID0gcy5zaXplKCk7CiAgIGlmKCBsZW4gPCAyICkgcmV0dXJuIHRydWU7CiAgIGZvciggaW50IGkgPSAwOyBpIDwgKGludClsZW4vMjsgKytpKQogICB7CiAgICAgIGlmKCBzW2ldICE9IHNbbGVuLWktMV0pCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiB0cnVlOwp9CgpzdHJpbmcgcmV2ZXJzZShjb25zdCBzdHJpbmcgJnMpCnsKICBpbnQgc3ogPSBzLnNpemUoKTsKICBzdHJpbmcgcmV2OwogIGZvcihpbnQgaSA9IDA7IGkgPCBzejsgKytpKQogICAgcmV2ICs9IHNbc3otaS0xXTsKICByZXYucmVzaXplKHN6KTsKICByZXR1cm4gcmV2Owp9CgppbnQgbWFpbigpCnsKICBzdHJpbmcgbGluZTsKICB3aGlsZShjaW4gPj4gbGluZSkKICB7CiAgICBpZihpc19wYWxpbihsaW5lKSkKICAgIHsKICAgICAgY291dCA8PCBsaW5lIDw8IGVuZGw7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHN0cmluZyByZXYgPSByZXZlcnNlKGxpbmUpOwogICAgICBpbnQgaW5kZXggPSBrbXBfbWF0Y2gobGluZSwgcmV2KTsKICAgICAgY291dCA8PCBsaW5lIDw8IHJldi5zdWJzdHIoaW5kZXgsIHJldi5zaXplKCktMSkgPDwgZW5kbDsKICAgIH0KICB9CiAgcmV0dXJuIDA7Cn0K
YmNhZApiY2ViY2NhZWRiYWJjYmJkCmVjYWNkY2FlCmNkZQpkYmJjZWRiZQpjZGVhYQpiYmFiZGNhYmJhYWVjYgpiZWRjZWEKYWVjCmVkYWNkYmRkZWRiZWVjYQpkZWNiYmVlYWFlZGNiY2NjYwpiYmFiYmFlZWVhZWJjCmJiYWVjY2JjZGJhYmRlZWRiYwpkZWFkZGFhZWJkCmFiYmJhZWRlZGJhZGFlZWVlY2IKYmNhZQpjYmNkYWNlYmRhZWNhZGRkZApkZWJlZGRkZGJhZWQKZGVjY2JlZGFkCmVjYWVhYWVlYmVjCmVjYwplZGJjZGVkYmRhY2JhYWJiCmRhYWJlYmNhZGJjCmVjY2VhYmNlZWFkYmRiYmFkZWEKZWJlYgpkZGRhYWJiZWFhZWJjYmNhYmVkYwpkY2VlYmFjY2JiZGNiCmVlYmVlYmFjYWRjYWVkYWUKZWJiCmVjY2NhYWFjZWFjCmRkYWVhZWJlYmNhZWVlZWRiYWEKYwplZGFiY2VkYmViZWVjY2JlYmNkZApjZGRkYmRkZGRkCmRhZWNiZGVhYmRjZWFkCmRjZGNiYWNiYWRjZWJhCmJhZWRjYWRiY2VjZWRlYwpkYWJjZGViYWUKY2FjZWVlZWFlZGFjYWRiZWVjZGMKZGVlYWNhYmViY2JjYWNkYgplYQpiY2NlYWIKY2VkYWQKYmFiYmViY2RlYmFjYQphYmRjY2NiZWFjYWMKYWVlZWFiYWRjZGRiYWViY2JhZWMKZWNkYWRkCmRjZWRjZGNlYmVhZWRkYWRlZGMKZGQKZWNlZWRjZWRjYmMKYWNiCmFiY2ViY2JiYmNhZWFkYWJiYgpiZWIKZGFkYmEKY2VjCmJlYmRjZQplZWJjYWJhZGFkZWViYWViYWEKZWRkZGFjY2NjYWRlYmRiCmRlZWRlY2NhZGVhY2VjCmFjYmRkZGQKYmFkY2JkCmFkYWViYmRhZWRlYmFhZGQKYmFlZWFjCmRjYmJhYWIKYWRiY2NiZWJhZWNjZWFkYwphZGNhYWRlZWNjZWNhY2VlZGRiCmQKY2NkYmRkZWNjZWFiY2FjYmJlZGIKZGRjZQpiY2FlZGVkYmIKYWNiZWViYWJlZWVhZGVkYmVkZQpjY2RjYmNjCmFhCmFlYWJkY2ViYmRhZGNiY2FiYWVjCmJjY2ViYmFjZGFlY2MKYmVjZQpjY2JiZGFjYgpiYWFhZGUKYmFjYWRlYWFiYWRkY2RjYmEKZGFhYWNkZGNkYWNjY2JlYgplYWRlZGRhZGNhYmUKYmNjZWNiY2NiYWRkZQpiYWJkZWRkZGRjYWNlYWFhCmRjY2NiZGVlZWJlYWNlYmNjYgpjYWNjZWNlZGFiYmVhZGJjYwplZGJhY2JhYmFjYWJlY2JkYmMKYgpjZWVjZWVhZWJjZGViYWJlYWVlCmViYmRlZQpjYmRhZWViZGVhZGFjZGRkCmFhZGRiYWRkYmIKY2FhYmJhZGFhZWFlY2VlZWVlZQpiYmRlZGRlYmJhYmJjY2NlY2RiCmVjZApkY2NjZGNjYWRjYmRiZGJlYQphZGFhZWVkYWNlZWFiYwphYmRlYWRkZGNkYgphYWFkYmRhYmNlYgpkCmVlZGViZWNlYWRhZGRjZWU=
bcad
bcebccaedbabcbbd
ecacdcae
cde
dbbcedbe
cdeaa
bbabdcabbaaecb
bedcea
aec
edacdbddedbeeca
decbbeeaaedcbcccc
bbabbaeeeaebc
bbaeccbcdbabdeedbc
deaddaaebd
abbbaededbadaeeeecb
bcae
cbcdacebdaecadddd
debeddddbaed
deccbedad
ecaeaaeebec
ecc
edbcdedbdacbaabb
daabebcadbc
ecceabceeadbdbbadea
ebeb
dddaabbeaaebcbcabedc
dceebaccbbdcb
eebeebacadcaedae
ebb
ecccaaaceac
ddaeaebebcaeeeedbaa
c
edabcedbebeeccbebcdd
cdddbddddd
daecbdeabdcead
dcdcbacbadceba
baedcadbcecedec
dabcdebae
caceeeeaedacadbeecdc
deeacabebcbcacdb
ea
bcceab
cedad
babbebcdebaca
abdcccbeacac
aeeeabadcddbaebcbaec
ecdadd
dcedcdcebeaeddadedc
dd
eceedcedcbc
acb
abcebcbbbcaeadabbb
beb
dadba
cec
bebdce
eebcabadadeebaebaa
edddaccccadebdb
deedeccadeacec
acbdddd
badcbd
adaebbdaedebaadd
baeeac
dcbbaab
adbccbebaecceadc
adcaadeeccecaceeddb
d
ccdbddecceabcacbbedb
ddce
bcaededbb
acbeebabeeeadedbede
ccdcbcc
aa
aeabdcebbdadcbcabaec
bccebbacdaecc
bece
ccbbdacb
baaade
bacadeaabaddcdcba
daaacddcdacccbeb
eadeddadcabe
bccecbccbadde
babdeddddcaceaaa
dcccbdeeebeacebccb
caccecedabbeadbcc
edbacbabacabecbdbc
b
ceeceeaebcdebabeaee
ebbdee
cbdaeebdeadacddd
aaddbaddbb
caabbadaaeaeceeeeee
bbdeddebbabbcccecdb
ecd
dcccdccadcbdbdbea
adaaeedaceeabc
abdeadddcdb
aaadbdabceb
d
eedebeceadaddcee