int main() { #ifndef LOCAL ios_base::sync_with_stdio(false);cin.tie(NULL); #define endl '\n' #endif size_t m; string line; while (cin >> m >> line) { size_t i = 0; string ans; a = line; tree.n = line.size(); memset(tree.t, -1, sizeof tree.t); tree.build(1, 0, line.size() - 1); set<char> seen; memset(choosed, 0, sizeof choosed); while (i < line.size()) { size_t to = min(line.size() - 1, i + m - 1); size_t best = tree.query(1, i, to); /* size_t best = to; for (int j = to; j >= int(i); --j) { if (line[j] < line[best]) best = j; }*/ ans.push_back(line[best]); seen.insert(line[best]); choosed[best] = true; i = best + 1; if (line.size() - best <= m) { break; } } char last = *(--seen.end()); for (size_t i = 0; i < line.size(); ++i) { if (!choosed[i] && line[i] < last) ans.push_back(line[i]); } sort(ans.begin(), ans.end()); cout << ans << endl; } return 0; }
void build (seg_tree &g) { for (int i = 1; i < maxn; ++i) f[maxn + i] = g.query (g.f[maxn + i], i); for (int i = maxn - 1; i; --i) f[i] = min (f[i * 2], f[i * 2 + 1]); }
T __sum(int u, int r) { T res; while (u != r) { int go = max(index[r] + 1, index[jump[u]]); res = res + st.query(go, index[u]); u = links.link[preorder[go]]; } return res; }
T sum(int u, int v) { int r = links.find(u, v); return st.query(index[r], index[r]) + __sum(u, r) + __sum(v, r); }
void assign(int loc, T value) { st.upd(index[loc], value); }