import
java.util.*;
public
class
Main
{
static
String lexicographicallyMaximum(String S,
int
N)
{
HashMap<Character, Integer> M =
new
HashMap<>();
for
(
int
i =
0
; i < N; ++i)
{
if
(M.containsKey(S.charAt(i)))
M.put(S.charAt(i), M.get(S.charAt(i)) +
1
);
else
M.put(S.charAt(i),
1
);
}
Vector<Character> V =
new
Vector<Character>();
for
(
char
i =
'a'
;
i < (
char
)(
'a'
+ Math.min(N,
25
)); ++i)
{
if
(M.containsKey(i) ==
false
)
{
V.add(i);
}
}
int
j = V.size() -
1
;
for
(
int
i =
0
; i < N; ++i)
{
if
(S.charAt(i) >= (
'a'
+ Math.min(N,
25
)) ||
(M.containsKey(S.charAt(i)) && M.get(S.charAt(i)) >
1
))
{
if
(V.get(j) < S.charAt(i))
continue
;
M.put(S.charAt(i), M.get(S.charAt(i)) -
1
);
S = S.substring(
0
, i) + V.get(j) + S.substring(i +
1
);
j--;
}
if
(j <
0
)
break
;
}
int
l =
0
;
for
(
int
i = N -
1
; i >=
0
; i--)
{
if
(l > j)
break
;
if
(S.charAt(i) >= (
'a'
+ Math.min(N,
25
)) ||
M.containsKey(S.charAt(i)) && M.get(S.charAt(i)) >
1
)
{
M.put(S.charAt(i), M.get(S.charAt(i)) -
1
);
S = S.substring(
0
, i) + V.get(l) + S.substring(i +
1
);
l++;
}
}
return
S;
}
public
static
void
main(String[] args)
{
String S =
"abccefghh"
;
int
N = S.length();
System.out.println(lexicographicallyMaximum(S, N));
}
}