Cod sursa(job #1317724)

Utilizator MoneaVladMonea Vlad MoneaVlad Data 15 ianuarie 2015 06:44:39
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <string.h>
#define LMAX 27

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

int n, m;

struct nod {
    int fii,nr;
    nod *urm[LMAX];
    nod() {
        nr = 0;
        fii = 0;
        for(int i = 0; i <= 26; i++)
            urm[i] = NULL;
    }
} *rad;

char c[30];
int op;

void ins(nod *p) {
    int i, lit;
    for(i = 0; c[i] != '\0'; i++)
    {
        lit = c[i] - 'a';
        if (!p->urm[lit])
        {
            p->urm[lit]=new nod();
            p->fii++;
        }
        p = p->urm[lit];
    }
    p->nr++;
}

int del(nod *p, int i) {
  if (c[i] == '\0') p->nr--;
  else
  {
    int lit = c[i] - 'a';
    if (del(p->urm[lit],i+1))
    {
         p->fii--;
         p->urm[lit] = NULL;

    }
  }
    if (p->fii == 0 && p->nr == 0 && p != rad)
    {
        delete p;
        return 1;
    }
    return 0;
}

int tipareste_ap(nod *p) {
   int i, lit;
   for(i = 0; c[i] != '\0'; i++)
   {
         lit = c[i] - 'a';
         if (!p->urm[lit])
            return 0;
         else
            p = p->urm[lit];
   }
   return p->nr;
}

int tiparesteprefix(nod *p) {
   int i, lit;
   for(i = 0; c[i] != '\0'; i++)
   {
      lit = c[i] - 'a';
      if (!p->urm[lit])
        return i;
      else
        p = p->urm[lit];
   }
   return strlen(c);
}

int main()
{
    rad = new nod;
    while(in >> op >> c)
    {
        if (op == 0) ins(rad);
        else if (op == 1) del(rad,0);
        else if (op == 2) out << tipareste_ap(rad) << "\n";
        else out << tiparesteprefix(rad) << "\n";
    }
    in.close();
    out.close();
    return 0;
}