Cod sursa(job #317770)

Utilizator alecmanAchim Ioan Alexandru alecman Data 25 mai 2009 07:16:55
Problema Nums Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.34 kb
#include<cstdio>
#include<cstring>

using namespace std;

#define INPUT "nums.in"
#define OUTPUT "nums.out"
#define SET(X) memset(X, 0, sizeof(X))

const long NMAX = 100001;

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

typedef struct Tr
{
  int nrChild;
  long curent, total;
  Tr* Child[ 10 ];
  
  Tr()
  {
    nrChild = curent = total = 0;
    SET(Child);
  }
};

char Sir[ NMAX ], Sir2[ NMAX ];
long maxDp;

Tr *Trie = new Tr;

int addTr(Tr* T, char *S)
{
  if(*S == '\n' || *S == '\0')
  {
    if(T -> curent == 0)
    {
      T -> curent = 1, T -> total = 1, T -> nrChild = 0;
      return 1;
    }
    return 0;
  }
  else
  {    
    if(T -> Child[ *S - '0' ] == NULL)
    {
      T -> Child[ *S - '0' ] = new Tr;
      T -> nrChild ++;
    }
    
    if(addTr(T -> Child[ *S - '0' ], S+1))
    {
      T -> total ++;
      return 1;
    }
  }
  
  return 0;
}

void searchTr(Tr* T, long P, int Start)
{
  long totalCur = 0;
  
  for(int i = 0; i <= 9; ++i)
  {
    if(T -> Child[ i ] != NULL)
    {
      totalCur += (T -> Child[ i ] -> total);
      if(totalCur >= P)
      {
        totalCur -= (T -> Child[ i ] -> total);
        if(!i && Start)
          searchTr(T -> Child[ i ], P-totalCur, 1);
        else
        {
          fprintf(fout, "%c", i+'0');
          searchTr(T -> Child[ i ], P-totalCur, 0);
        }
        break;
      }
    }
  }
}

int main()
{
  long N, Poz, len, V;
  int Code;
  Tr *T, *T2;

  fscanf(fin, "%ld", &N);
  
  maxDp = 0;
  
  for(;N--;)
  {
    SET(Sir);
    
    fscanf(fin, "%d", &Code);
        
    if(Code)
    {
      fscanf(fin, "%s", &Sir);
      len = strlen(Sir);
      
      if(maxDp == 0) maxDp = len;
      
      if(maxDp < len)
      {
        V = Trie -> total;
        T = new Tr;
        T -> total = V;
        T2 = T;
        for(long i = 1; i < len-maxDp; ++i)
        {
          T -> Child[ 0 ] = new Tr;
          T = T -> Child[ 0 ];
          T -> total = V;
        }
        T -> Child[ 0 ] = Trie;
        Trie = T2;
        maxDp = len;
      }
      
      for(long i = 0; i < maxDp; ++i)
        if(i >= maxDp - len) Sir2[ i ] = Sir[ i - maxDp + len ];
        else Sir2[ i ] = '0';
      
      addTr(Trie, Sir2);
    }
    else
    {
      fscanf(fin, "%ld", &Poz);
      searchTr(Trie, Poz, 1);
      fprintf(fout, "\n");
    }
  }
      
  fclose(fin);
  fclose(fout);
  
  return 0;
}