Cod sursa(job #1701041)

Utilizator TincaMateiTinca Matei TincaMatei Data 12 mai 2016 00:04:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <cstdio>
#include <cstring>

const int MAX_LITERE = 20;

char cuv[MAX_LITERE+1];

struct Trie {
  int aparitii, fii;
  Trie* next[26];
  Trie() {
    aparitii = fii = 0;
    memset(next, 0, sizeof(next));
  }
}*myTrie;

void addCuv(char* cuv, int i, Trie *t) {
  if(cuv[i] == '\0')
    t -> aparitii++;
  else {
    if(t->next[cuv[i] - 'a'] == 0) {
      t->next[cuv[i] - 'a'] = new Trie;
      t->fii++;
    }
    addCuv(cuv, i + 1, t -> next[cuv[i] - 'a']);
  }
}

int delCuv(char* cuv, int i, Trie *t) {
  int rez;
  if(cuv[i] == '\0')
    t -> aparitii--;
  else {
    rez = delCuv(cuv, i + 1, t -> next[cuv[i] - 'a']);
    if(rez == 1) {
      t -> next[cuv[i] - 'a'] = 0;
      t -> fii--;
    }
  }
  if(t -> fii == 0 && t -> aparitii == 0 && t != myTrie) {
    delete t;
    return 1;
  }
  return 0;
}

int query(char *cuv, int i, Trie *t) {
  if(t == 0) {
    return 0;
  } else if(cuv[i] == '\0')
    return t -> aparitii;
  else
    return query(cuv, i + 1, t -> next[cuv[i] - 'a']);
}

int prefix(char *cuv, int i, Trie *t, int acum) {
  if(cuv[i] == '\0' || t -> next[cuv[i] - 'a'] == 0)
    return acum;
  else
    return prefix(cuv, i + 1, t -> next[cuv[i] - 'a'], acum + 1);
}

char ch;

void readWord(FILE *fin) {
  int i;
  i = 0;
  while(ch != '\n' && ch != EOF) {
    cuv[i] = ch;
    i++;
    ch = fgetc(fin);
  }
  cuv[i] = '\0';
}

int main() {
  int tipQuery;
  myTrie = new Trie;
  FILE *fin = fopen( "trie.in" , "r" );
  FILE *fout = fopen( "trie.out" , "w" );
  while(fscanf(fin, "%d", &tipQuery) == 1) {
    ch = fgetc(fin);
    while(ch == ' ')
      ch = fgetc(fin);
    readWord(fin);
    if(tipQuery == 0)
      addCuv(cuv, 0, myTrie);
    else if(tipQuery == 1)
      delCuv(cuv, 0, myTrie);
    else if(tipQuery == 2)
      fprintf(fout, "%d\n", query(cuv, 0, myTrie));
    else
      fprintf(fout, "%d\n", prefix(cuv, 0, myTrie, 0));
  }
  fclose( fin );
  fclose( fout );
  return 0;
}