Cod sursa(job #1701037)

Utilizator TincaMateiTinca Matei TincaMatei Data 11 mai 2016 23:51:48
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <cstdio>
#include <cstring>

const int MAX_LITERE = 20;

char cuv[MAX_LITERE+1];

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

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

int delCuv(char* cuv, int i, Trie *t) {
  int rez;
  t -> treceri--;
  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;
  }
  if(t -> treceri == 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) {
  if(t == 0)
    return -1;
  else if(cuv[i] == '\0')
    return -1;
  else
    return prefix(cuv, i + 1, t -> next[cuv[i] - 'a']) + 1;
}

char ch;

void readWord(FILE *fin) {
  int i;
  i = 0;
  while(ch != '\n') {
    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));
  }
  fclose( fin );
  fclose( fout );
  return 0;
}