Cod sursa(job #2075170)

Utilizator GrasuneAlexandruGrasune Alexandru Mihai GrasuneAlexandru Data 25 noiembrie 2017 11:41:49
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct nod
{
    int vf;
    nod *a[27];
    int nrfii;
    nod()
    {
        for(int i=0; i<27; i++)
            a[i]=NULL;
        nrfii=vf=0;
    }

};
nod *tree=new nod;

void adaugare(char x[],int n,nod *v)
{
    for(int i=1; i<n; i++)
    {

        if(v->a[x[i]-'a']==NULL)
        {
            nod *c=new nod();
            v->a[x[i]-'a']=c;
            v->nrfii++;
        }

        v = v->a[x[i]-'a'];
        if(i==n-1)
            v->vf++;

    }
}
void aparitii(char x[],int n,nod *v)
{
    for(int i=1; i<n; i++)
    {
        if(v->a[x[i]-'a']==NULL)
        {
            fout<<0<<endl;
            return;
        }
        else
            v = v->a[x[i]-'a'];
        if(i==n-1)
            fout<<v->vf<<endl;


    }

}
bool stergere(char x[],int n,nod *v,int ind)
{
    if(ind==n)
    {
        v->vf--;
        n--;
    }

    else if(stergere(x,n,v->a[x[ind]-'a'],ind+1))
    {
        v->nrfii--;
        v->a[x[ind]-'a']=NULL;
    }
    if(v->nrfii==0&&v->vf==0&&v!=tree)
    {
        delete v;
        return 1;
    }
    return 0;

}
int  prefix(char x[],int n,nod *v,int ind)
{
    if(v->a[x[ind]-'a']==NULL)
        return ind-1;
    return prefix(x,n,v->a[x[ind]-'a'],ind+1);
}


int main()
{
    int op;
    char cuv[100];

    while(!fin.eof())
    {
        fin>>op;
        fin.get(cuv,1000);
        if(op==0)
            adaugare(cuv,strlen(cuv),tree);
        if(op==1)
            stergere(cuv,strlen(cuv),tree,1);
        if(op==2)
            aparitii(cuv,strlen(cuv),tree);
        if(op==3)
            fout<<prefix(cuv,strlen(cuv),tree,1)<<endl;

    }

    return 0;
}