Exemple #1
0
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;
}
Exemple #2
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);
 }