Cod sursa(job #2285579)

Utilizator ZappaManIosif Adrian-Mihai ZappaMan Data 18 noiembrie 2018 19:05:30
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <stdio.h>

#define ASIZE 26

struct Tr {
   Tr() {
      app = ccnt = 0;
      for (int i = 0; i < ASIZE; ++i) {
         next[i] = 0;
      }
   }
   Tr* next[ASIZE];
   int app, ccnt;
};

Tr * root = new Tr();

void add_word(char* w) {
   Tr *node = root;

   while (*w) {
      int ix = int(*w - 'a');
      if (node->next[ix] == 0) {
         Tr* new_node = new Tr();
         node->next[ix] = new_node;
         node->ccnt++;

         node = new_node;
      } else {
         node = node->next[ix];
      }
      w++;
   }
   if (node != root) {
      node->app += 1;
   }
}

bool delete_(char* w, Tr* node) {
   if (*w == 0) {
      node->app--;
   } else {
      int ix = int(w[0] - 'a');
      if (node->next[ix] != 0) {
         if (delete_(w+1, node->next[ix])) {
            node->ccnt--;
            node->next[ix] = 0;
         }
      }
   }

   if (node->app <= 0 && node->ccnt <= 0 && node != root) {
      delete node;
      return 1;
   }

   return 0;
}

void delete_word(char* w) {
   delete_(w, root);
}

int get_word(char* w) {
   Tr *node = root;

   while (*w) {
      int ix = int(*w - 'a');
      if (node->next[ix] == 0) {
         return 0;
      } else {
         node = node->next[ix];
      }
      w++;
   }

   return node->app;
}

int get_longest(char* w) {
   Tr *node = root;

   int longest_pref = 0;
   while (*w) {
      int ix = int(*w - 'a');
      if (node->next[ix] == 0) {
         return longest_pref;
      } else {
         longest_pref += 1;
         node = node->next[ix];
      }

      w++;
   }

   return longest_pref;
}


int main() {
   freopen("trie.in", "r", stdin);
   freopen("trie.out", "w", stdout);

   int type;
   char word[20];

   while (scanf("%d %s", &type, word) != EOF) {
      switch (type) {
         case 0:
            add_word(word);
            break;
         case 1:
            delete_word(word);
            break;
         case 2:
            printf("%d\n", get_word(word));
            break;
         case 3:
            printf("%d\n", get_longest(word));
            break;
      }
   }
   fclose(stdin);
   fclose(stdout);
   return 0;
}