Cod sursa(job #2553564)

Utilizator elenaisaiaElena Isaia elenaisaia Data 22 februarie 2020 09:50:35
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

int n;
char s[23];

struct trie
{
    int nrap,nrfii;
    trie *fii[26];
    trie()
    {
        nrap=nrfii=0;
		for(int i=0;i<26;i++)
            fii[i]=0;
    }
};
trie *t=new trie;

void adaug(trie *nod,char s[23])
{
    if(*s=='\0')
    {
        nod->nrap++;
        return;
    }
    if(nod->fii[*s-'a']==0)
    {
        nod->fii[*s-'a']=new trie;
        nod->nrfii++;
    }
    adaug(nod->fii[*s-'a'],s+1);
}

int sterg(trie *nod,char *s)
{
    if(*s=='\0')
        nod->nrap--;
    else if(sterg(nod->fii[*s-'a'],s+1))
    {
        nod->fii[*s-'a']=0;
        nod->nrfii--;
    }
    if(nod->nrap==0&&nod->nrfii==0&&nod!=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}

int apar(trie *nod,char *s)
{
    if(*s=='\0')
        return nod->nrap;
    if(nod->fii[*s-'a']!=0)
        return apar(nod->fii[*s-'a'],s+1);
    return 0;
}

int pref(trie *nod,char *s,int p)
{
    if(*s=='\0'||nod->fii[*s-'a']==0)
        return p;
    return pref(nod->fii[*s-'a'],s+1,p+1);
}

void citire()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    while(fin>>n)
    {
        fin>>s;
        if(n==0)
            adaug(t,s);
        else if(n==1)
            sterg(t,s);
        else if(n==2)
            fout<<apar(t,s)<<"\n";
        else
            fout<<pref(t,s,0)<<"\n";
    }
}

int main()
{
    citire();
    return 0;
}