import
java.io.*;
import
java.lang.*;
import
java.util.*;
class
GFG {
static
String makeReverse(String str)
{
StringBuffer s =
new
StringBuffer(str);
str = s.reverse().toString();
String[] rev = str.split(
" "
);
StringBuffer reverse =
new
StringBuffer();
for
(
int
i = rev.length -
1
; i >=
0
; i--) {
reverse.append(rev[i]).append(
" "
);
}
return
reverse.toString();
}
static
int
kmp(String s)
{
int
[] lps =
new
int
[s.length()];
for
(
int
i =
1
; i < s.length(); i++) {
int
previous_index = lps[i -
1
];
while
(previous_index >
0
&& s.charAt(i)
!= s.charAt(previous_index)) {
previous_index = lps[previous_index -
1
];
}
lps[i]
= previous_index
+ (s.charAt(i) == s.charAt(previous_index)
?
1
:
0
);
}
return
lps[lps.length -
1
];
}
static
int
remainingStringLongestPallindrome(String s)
{
String t = s +
"?"
;
String reversed
=
new
StringBuilder(s).reverse().toString();
t += reversed;
return
kmp(t);
}
static
String longestPrefixSuffixPallindrome(String s)
{
int
length =
0
;
int
n = s.length();
for
(
int
i =
0
, j = n -
1
; i < j; i++, j--) {
if
(s.charAt(i) != s.charAt(j)) {
break
;
}
length++;
}
String ans = s.substring(
0
, length);
String remaining
= s.substring(length, (n - length));
if
(remaining.length() >
0
) {
int
longest_prefix
= remainingStringLongestPallindrome(
remaining);
remaining =
new
StringBuilder(remaining)
.reverse()
.toString();
int
longest_suffix
= remainingStringLongestPallindrome(
remaining);
if
(longest_prefix > longest_suffix) {
ans += remaining.substring(
0
,
longest_prefix);
}
else
{
ans += remaining.substring(
0
,
longest_suffix);
}
}
ans += s.substring(n - length);
return
ans;
}
public
static
void
main(String[] args)
{
String str =
"rombobinnimor"
;
System.out.println(
longestPrefixSuffixPallindrome(str));
}
}