Cod sursa(job #1374465)

Utilizator c0rn1Goran Cornel c0rn1 Data 5 martie 2015 09:28:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define NMAX 30
#define C ((*p) - 'a')

using namespace std;

struct node{
   int nr, nrChild;
   node *child[NMAX];
   node(){
      nr = nrChild = 0;
      memset(child, 0, sizeof(child));
   }
};
node *root = new node;
char w[NMAX];

void add(node *n, char *p)
{
   if (!(*p)){
      n->nr++;
      return;
   }
   if (n->child[C] == 0){
      n->child[C] = new node;
      n->nrChild++;
   }
   add(n->child[C], p+1);
}

int del(node *n, char *p)
{
   if (!(*p)){
      n->nr--;
   }
   else if (del(n->child[C], p+1)){
      n->nrChild--;
      n->child[C] = 0;
   }

   if (n->nr == 0 && n->nrChild == 0 && n != root){
      delete n;
      return 1;
   }
   return 0;
}

int numarAparitii(node *n, char *p)
{
   if (!(*p)){
      return n->nr;
   }
   if (n->child[C] == 0){
      return 0;
   }
   return numarAparitii(n->child[C], p+1);
}

int prefComun(node *n, char *p)
{
   if (!n->child[C] || !(*p)){
      return 0;
   }
   return 1 + prefComun(n->child[C], p+1);
}

int main()
{
   freopen("trie.in", "r", stdin);
   freopen("trie.out", "w", stdout);
   int op;
   root->nr = 0;
   while (!feof(stdin)){
      scanf("%d %s\n", &op, &w);
      switch(op){
      case 0:
         add(root, w);
         break;
      case 1:
         del(root, w);
         break;
      case 2:
         printf("%d\n", numarAparitii(root, w));
         break;
      case 3:
         printf("%d\n", prefComun(root, w));
         break;
      default:
         printf("-1\n");
         break;
      }
   }

   return 0;
}