Cod sursa(job #1958287)

Utilizator heracleRadu Muntean heracle Data 8 aprilie 2017 11:22:09
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <cstdio>
#include <iostream>

using namespace std;


struct nod
{
	int prefix,aparitii;
	nod *nxt[26];

	nod()//functie cu numele variabilei
	{
		prefix=0;
		aparitii=0;
		for(int i=0; i<26; i++)
			nxt[i]=NULL;
	}
} *rad;


char cuv[30];

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 search(nod *act, char v[])
{
    if(act==NULL)
        return 0;

    if(v[0]==0)
    {
        return act->aparitii;
    }

    return search(act->nxt[v[0]-'a'], v+1);
}

nod *erase(nod *act, char v[])
{
    act->prefix--;

    if(v[0]==0)
    {
        act->aparitii--;

        if(act->aparitii==0 && act->prefix==0)// act->prefix==0 e suficient
        {
            delete act;
            act=NULL;
        }

        return act;
    }

    act->nxt[v[0]-'a'] = erase(act->nxt[v[0]-'a'], v+1);

    if(act->prefix==0)
    {
        delete act;
        act=NULL;
    }

    return act;
}

nod *insert(nod *act, char v[])// in v[0] avem mereu litera actuala, fiindca am primit ca
                            // parametru v+1, adica am taiat prima litera din fostul v
{
	if(act==NULL)
	{
		act=new nod;
	}

	act->prefix++;

	if( v[0] == 0 )
    {
        act->aparitii++;
        return act;
    }

	act->nxt[ v[0]-'a' ] = insert(act->nxt[ v[0]-'a' ],v+1);//v[0] va fi in intervalul [96..96+26] unde se afla 'a'-'z' in codul ascii
                                                            //v[0]-'a' se va afla in intervalul [0,26), exact ce ne trebuie


	return act;
}

int main()
{
    ios_base::sync_with_stdio(false);
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
	int t;


	while(cin>>t)
	{
		cin>>cuv;

		if(t==0)
		{
			rad=insert(rad,cuv);
		}
		if(t==1)
        {
            rad=erase(rad,cuv);
        }
        if(t==2)
            cout<<search(rad,cuv)<<"\n";
        if(t==3)
            cout<<len_prefix(rad,cuv)<<"\n";
	}
}