Cod sursa(job #405286)

Utilizator Pepelea_FlaviuFlaviu Pepelea Pepelea_Flaviu Data 27 februarie 2010 20:54:22
Problema Nums Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 kb
# include <cstdio>
# include <queue>
# include <string.h>
# include <stdlib.h>
# include <algorithm>

using namespace std;

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

int A[MAX_N];
char t[MAX_N], *s[MAX_N];
int N, i, j, op, cnt, len, bnd, k, c, cnz, dnt, pow;
int ct[MAX_N], *nums[MAX_N], aux[MAX_N], zero[MAX_N], zk[MAX_N];
    
     int cmp(int A, int B)
     {
         if (strcmp(s[A], s[B]) < 0) return 1;
         return 0;
     }
     
     void update(int pz)
     {   
         for (int i = pz; i <= dnt; i += pz & (pz ^ (pz - 1))) ++A[i];
     }
     
     void query(int k, int pow)
     {
         
     }

     int main()
     {
         freopen(FIN, "r", stdin);
         freopen(FOUT, "w", stdout);
         
         scanf("%d", &N);
         
         cnt = 0; cnz = 0;
         for (i = 1; i <= N; ++i)
         {
             scanf("%d ", &op);
             
             if (op == 1)
             {
                 gets(t);
                 ++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];
             } else 
             {
                 scanf("%d", &zk[++cnz]);
                 zero[cnz] = cnt;
             }
         }
         
         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]) sort(nums[i] + 1, nums[i] + nums[i][0] + 1, cmp);
            
         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;
         
         c = 0;
         
         for (pow = 1; pow << 1 <= dnt; ++pow);
         for (i = 1; i <= cnz; ++i)
         {
             /*while (c != zero[i]) update(1, 1, dnt, aux[++c]);
             printf("%s\n", s[ct[query(1, 1, dnt, zk[i])]]);*/
         }
         
         return 0;
     }