Cod sursa(job #2082098)

Utilizator MarinPeptenaruMarin Vasile Peptenaru MarinPeptenaru Data 5 decembrie 2017 18:31:43
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.81 kb
#include <bits/stdc++.h>
#include <cstdlib>
#define val(x) (x-'a')
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct trie
{
    int cuv; /// nr de aparitie ale cuvantului
    int nr; /// nr de cuvinte care contin secventa respectiva ca prefix
    trie *fii[30]; /// vectorul in care retin legaturile dintre nodurile arborilor
} *radacina;/// radacina arborelui
void insereaza (char s[], int i, int lg, trie *nod)
{
    int litera=val(s[i]); /// retin indicele literei s[i] in alfabet
    if(nod->fii[litera]==NULL) /// daca nu am legatura catre litera respectiva
        nod->fii[litera]=new trie;/// o creez
    nod=nod->fii[litera];/// si ma mut pe nodul respectiv
    nod->nr++;/// nr de aparitii ale secventei respective creste cu 1
    if(i==lg-1) nod->cuv++;/// daca sunt la ultima litera cresc nr de aparitii ale cuvantului
    else insereaza(s,i+1,lg,nod->fii[litera]);/// altfel inserez urmatoarea litera
}
void sterge (char s[], int i, int lg, trie *nod)
{
    int litera=val(s[i]); /// retin indicele
    nod=nod->fii[litera];/// trec la litera pe care o verific
    nod->nr--;/// scad nr de aparitii al prefixului respectiv
    if(i==lg-1) nod->cuv--;/// daca sunt la ultima litera scad nr de aparitii ale intregului cuvant
    else sterge(s,i+1,lg,nod);/// altfel sterg urmatoare litera
}
int numara (char s[], int i, int lg, trie *nod)
{
    int litera=val(s[i]);
    nod=nod->fii[litera]; /// ma mut pe nodul literei pe care o verific
    if(nod==NULL || nod->nr==0) return 0;/// daca nodul meu este NULL sau daca prefixul parcurs pana acum apare de 0 ori inseamna ca cuvantul respectiv nu apare
    else if(i==lg-1) return nod->cuv; /// daca sunt la ultima litera atunci returnez nr de aparitii al cuvantului
    else numara(s,i+1,lg,nod);/// altfel trec la urmatoarea litera
}
int pref;
void prefix (char s[], int i, int lg, trie *nod)
{
    int litera=val(s[i]);
    nod=nod->fii[litera]; /// trec la nodul literei in chestiune
    if(nod==NULL || nod->nr<1) return;/// daca nodul nu exista sau prefixul nu exista ma opresc
    pref++;/// cresc lungimea prefixului pe care l-am gasit pana acum
    if(i!=lg-1) prefix(s,i+1,lg,nod);/// daca nu am ajuns la ultima litera ma opresc
}
int op;char s[30];
int main()
{
    radacina=new trie;
    radacina->cuv=0;
    radacina->nr=0;
    while(in>>op>>s)
    {
        switch(op)
        {
            case 0:
            insereaza(s,0,strlen(s),radacina);
            break;
            case 1:
            sterge(s,0,strlen(s),radacina);
            break;
            case 2:
            out<<numara(s,0,strlen(s),radacina)<<'\n';
            break;
            case 3:
            pref=0;
            prefix(s,0,strlen(s),radacina);
            out<<pref<<'\n';
            break;
        }
    }
    return 0;
}