class FoxAndHandle {
public:
string lexSmallestName(string S)
{
string H;
const int N = S.size();
bool vis[N];
fill(vis, vis + N, false);
vector< pair<char, int> > cand;
for (int i = 0; i < N; ++i) {
cand.push_back(make_pair(S[i], i));
}
sort(cand.begin(), cand.end());
int prev = -1;
while (H.size() < S.size() / 2) {
for (int i = 0; i < cand.size(); ++i) {
int j = cand[i].second;
unless (prev < j) continue;
map<char, int> cnt;
for (int k = 0; k < N; ++k) {
++cnt[S[k]];
}
for (int k = 0; k < H.size(); ++k) {
--cnt[H[k]];
--cnt[H[k]];
}
if (cnt[cand[i].first] <= 0) continue;
int rest = 0;
for (int k = j; k < N; ++k) {
if (2 <= cnt[S[k]]) {
++rest;
cnt[S[k]] -= 2;
}
}
if (S.size() / 2 <= H.size() + rest) {
prev = j;
H += S[j];
vis[j] = true;
break;
}
}
}
return H;
}
};
12/09/2012
SRM563 Div1 Easy
300