Cod sursa(job #405181)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 27 februarie 2010 18:55:06
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.5 kb
# include <cstdio>
# include <queue>
# include <string.h>
# include <stdlib.h>

using namespace std;

# define FIN "nums.in"
# define FOUT "nums.out"
# define max(a, b) (a > b ? a : b)
# define MAX_N 100005

pair <int, int> I;
queue <pair <int, int> > Q;

int A[MAX_N << 1];
char t[MAX_N], *s[MAX_N];
int N, i, j, op, cnt, len, bnd, k;
int ct[MAX_N], *nums[MAX_N], aux[MAX_N];

     void radixsort(int len)
     {
         int cif[10], poz[10], i, p = 0, sum = 0, cur, t = 0;
         
         Q.push(make_pair(1, nums[len][0]));
         while (!Q.empty())
         {
              I = Q.front(); Q.pop();
              
              if (I.first != I.second && p < len)
              {
                   memset(cif, 0, sizeof(cif));
                   memset(poz, 0, sizeof(poz));
                   for (i = I.first; i <= I.second; ++i) ++cif[s[nums[len][i]][p] - '0'];
              
                   for (i = 1; i <= 9; ++i) cif[i] += cif[i - 1];
                   for (i = I.first; i <= I.second; ++i)
                   {
                       cur = s[nums[len][i]][p] - '0';
                       ++poz[cur];
                       if (!cur) aux[poz[cur]] = nums[len][i];
                       else aux[cif[cur - 1] + poz[cur]] = nums[len][i];
                   }
              
                   for (i = I.first; i <= I.second; ++i) nums[len][i] = aux[i - I.first + 1];
              
                   if (cif[0]) Q.push(make_pair(I.first, I.first + cif[0] - 1));
                   for (i = 1; i <= 9; ++i)
                      if (cif[i] != cif[i - 1]) Q.push(make_pair(I.first + cif[i - 1], I.first + cif[i] - 1));
              } else ++t;
              
              sum += I.second - I.first + 1;
              if (sum == nums[len][0]) sum = t, ++p;
         }
     }
     
     void update(int Nod, int St, int Dr, int Pz)
     {
          if (St == Dr)
          {
               A[Nod] = 1;
               return;
          }
          
          int Mij = (St + Dr) >> 1;
          
          if (Pz <= Mij) update(Nod << 1, St, Mij, Pz);
          else update(Nod << 1 | 1, Mij + 1, Dr, Pz);
          
          A[Nod] = A[Nod << 1] + A[Nod << 1 | 1];
     }
     
     int query(int Nod, int St, int Dr, int K)
     {
         if (St == Dr) return St;
         
         int Mij = (St + Dr) >> 1;
         
         if (A[Nod << 1] >= K) return query(Nod << 1, St, Mij, K);
         else return query(Nod << 1 | 1, Mij + 1, Dr, K - A[Nod << 1]);
     }

     int main()
     {
         freopen(FIN, "r", stdin);
         freopen(FOUT, "w", stdout);
         
         scanf("%d", &N);
         
         cnt = 0;
         for (i = 1; i <= N; ++i)
         {
             scanf("%d ", &op); gets(t);
             
             if (op == 1)
             {
                 ++ct[len = strlen(t)];
                 bnd = max(bnd, len);
                 s[++cnt] = (char *) malloc(len + 1);
                 for (j = 0; j <= len; ++j) s[cnt][j] = t[j];
             }
         }
         
        /* for (i = 1; i <= bnd; ++i) nums[i] = (int *) malloc((ct[i] + 1) * sizeof(int)), nums[i][0] = 0;
         for (i = 1; i <= cnt; ++i)
         {
             len = strlen(s[i]);
             nums[len][++nums[len][0]] = i;
         }
         
         for (i = 1; i <= bnd; ++i)
            if (ct[i]) radixsort(i);
            
         int dnt = 0;
         for (i = 1; i <= bnd; ++i)
            if (ct[i])
            {
                aux[nums[i][1]] = ++dnt;
                for (j = 2; j <= nums[i][0]; ++j)
                {
                    for (k = 0; k < i; ++k)
                       if (s[nums[i][j]][k] != s[nums[i][j - 1]][k]) break;
                    if (k != i) aux[nums[i][j]] = ++dnt;
                    else aux[nums[i][j]] = dnt;
                }
            }
         for (i = 1; i <= cnt; ++i) ct[aux[i]] = i;
         
         freopen(FIN, "r", stdin);
         
         scanf("%d", &N);
         
         int c = 0;
         for (i = 1; i <= N; ++i)
         {
             scanf("%d ", &op);
             
             if (op == 1)
             {
                  gets(t);
                  update(1, 1, dnt, aux[++c]);
             } else
             {
                  scanf("%d", &k);      
                  //printf("%s\n", s[ct[query(1, 1, dnt, k)]]);
             }
         }*/
         
         for (i = 1; i <= cnt; ++i) printf("%s\n", s[i]);
         
         return 0;
     }