Cod sursa(job #1958299)

Utilizator andreeagoideaAndreea Goidea andreeagoidea Data 8 aprilie 2017 11:27:33
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <cstdio>
#include <fstream>

using namespace std;

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

struct nod
{int aparitii, prefix;
nod *nxt[26];
nod() //functie cu numele variabilei, pentru a verifica daca nodul a mai fost parcurs; se numeste constructor
{
    prefix=0;
    aparitii=0;
    for(int i=0; i<26; i++) nxt[i]=NULL;
}
}*rad;;

char cuv[30];

nod *insert(nod *act, char v[])
{
    if(act==NULL)
    {
        act=new nod;
    }
    act->prefix++; //sau (*act).prefix++;
    if (v[0]==0) //verificare daca s-a terminat cuvantul
    {
        act->aparitii++;
        return act;
    }
    act->nxt[v[0]-'a']=insert(act->nxt[v[0]-'a'], v+1); //v[0] e in [96, 96+26); dar v[0]-'a' e in [0, 26)
    return act;
}

nod *erase(nod *act, char v[])
{
    act->prefix--; //se scade o aparitie
    if (v[0]==0) //verificare daca s-a terminat cuvantul
    {
        act->aparitii--;
        if(act->prefix==0 && act->aparitii==0 ) //act->prefix==0 e suficient pentru a verifica daca mai are o valoare nenula in nod
        {
            delete act;
            act==NULL;
        }
        return act;
    }
    if(act->prefix==0)
    {
        delete act;
        act=NULL;
    }
    act->nxt[v[0]-'a']=erase(act->nxt[v[0]-'a'], v+1);
}

int search(nod *act, char v[])
{
    if(act==NULL) return 0;
    if(v[0]==0) return act->aparitii;
    else return search(act->nxt[v[0]-'a'], v+1);
}

int len_prefix(nod *act, char v[])
{
    if(act==NULL) return -1;
    if(v[0]==0) return 0;
    int val=len_prefix(act->nxt[v[0]-'a'], v+1);
    return 1+val;
}

int main()
{
    int t;
    while(f>>t)
    {
        f>>cuv;
        f.get();
        if(t==0) rad=insert(rad, cuv);
        if(t==1) rad=erase(rad, cuv);
        if(t==2) g<<search(rad, cuv)<<"\n";
        if(t==3) g<<len_prefix(rad, cuv)<<"\n";
    }
    return 0;
}