import
java.util.*;
class
Main
{
public
static
String maxValue(String s,
int
i,
int
j)
{
Map<Character, Integer> mp
=
new
TreeMap<Character, Integer>(
Collections.reverseOrder());
for
(
int
k = i; k <= j; k++) {
if
(mp.containsKey(s.charAt(k))) {
mp.put(s.charAt(k),
mp.get(s.charAt(k)) +
1
);
}
else
{
mp.put(s.charAt(k),
1
);
}
}
String res =
""
, oddChar =
""
;
for
(Map.Entry<Character, Integer> entry :
mp.entrySet()) {
if
(entry.getValue() %
2
!=
0
) {
oddChar
= Character.toString(entry.getKey());
}
else
{
res +=
new
String(
new
char
[entry.getValue() /
2
])
.replace(
"\0"
,
Character.toString(
entry.getKey()));
}
}
String reverseRes
=
new
StringBuilder(res).reverse().toString();
return
res + oddChar + reverseRes;
}
public
static
String maxOfBoth(String s1, String s2)
{
if
(s1.length() > s2.length())
return
s1;
else
if
(s2.length() > s1.length())
return
s2;
return
((s1.compareTo(s2) >
0
) ? s1 : s2);
}
public
static
String maxPalindrome(String s)
{
int
[] visited =
new
int
[
5555
];
Arrays.fill(visited, -
1
);
int
mask =
0
, n = s.length();
String result =
"0"
;
for
(
int
i =
0
; i < n; i++)
{
mask ^= (
1
<< (s.charAt(i) -
'0'
));
if
(mask ==
0
)
{
result
= maxOfBoth(result, maxValue(s,
0
, i));
}
for
(
int
j =
0
; j <=
9
; j++)
{
int
newMask = mask;
newMask ^= (
1
<< j);
if
(newMask ==
0
)
{
result = maxOfBoth(result,
maxValue(s,
0
, i));
}
else
if
(visited[newMask] != -
1
)
{
result = maxOfBoth(
result,
maxValue(s, visited[newMask] +
1
,
i));
}
}
if
(visited[mask] == -
1
) {
visited[mask] = i;
}
}
return
result;
}
public
static
void
main(String[] args)
{
String s =
"25242459"
;
System.out.println(maxPalindrome(s));
}
}