func_code_string: #include <bits/stdc++.h>   char str[100010], out[100010], visited[100010];   int n, m, len, ar[100010], counter[256], tree[100010];   void update(int p, int v) {     p++;     while (p <= n) {       tree[p] += v;       p += (p & (-p));     }   }   int query(int p) {     int res = 0;     while (p) {       res += tree[p];       p ^= (p & (-p));     }     return res;   }   int range_query(int l, int r) {     l++, r++;     if (l > r) return 0;     return (query(r) - query(--l));   }   int main() {     int i, j, k, l, c, res, flag;     while (scanf( %d , &m) != EOF) {       scanf( %s , str);       n = strlen(str);       memset(counter, 0, sizeof(counter));       memset(tree, 0, sizeof(tree));       for (i = 0; i < n; i++) counter[str[i]]++;       for (c =  a ; c <=  z ; c++) {         for (i = 0; i < n; i++) {           if (str[i] == c) update(i, 1);         }         flag = 1;         for (i = 0; (i + m) <= n; i++) {           if (range_query(i, i + m - 1) == 0) {             flag = 0;             break;           }         }         if (flag) break;       }       for (i = 0, len = 0; i < n; i++) {         if (str[i] == c) {           update(i, -1);           ar[len++] = i;         }       }       res = 0;       memset(visited, 0, sizeof(visited));       for (i = 0, j = 0; (i + m) <= n; i++) {         if (range_query(i, i + m - 1) == 0) {           k = -1;           while (j < len) {             if ((ar[j] + m - 1) < i)               j++;             else {               if (ar[j] > (i + m - 1)) break;               k = j++;             }           }           assert(k != -1);           visited[k] = 1;           update(ar[k], 1);         }       }       for (i = 0; i < 100010; i++) res += visited[i];       len = 0;       for (i =  a ; i < c; i++) {         for (j = 0; j < counter[i]; j++) {           out[len++] = i;         }       }       for (i = 0; i < res; i++) out[len++] = c;       out[len] = 0;       puts(out);     }     return 0;   }   