Cod sursa(job #2558697)

Utilizator BaraianTudorBaraian Tudor Stefan BaraianTudor Data 26 februarie 2020 19:05:08
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
int n;
char c[27];
struct trie
{
    int nrcuv,nrfii;
    trie *fii[27];
    trie()
    {
        nrcuv=nrfii=0;
        for(int i=0;i<27;i++)
        {
            fii[i]=0;
        }
    }
};
trie *sol;
void add(trie* nod,char* x)
{
    if(*x==0)
    {
       nod->nrcuv++;
       return;
    }
    if(nod->fii[*x-'a']==0)
    {
        nod->fii[*x-'a']=new trie;
        nod->nrfii++;
    }
    add(nod->fii[*x-'a'],x+1);
}
int sterge(trie* nod,char*x)
{
    if(*x==0)
    {
        nod->nrcuv--;
        if(nod->nrcuv==0 && nod->nrfii==0 && nod!=sol){delete nod;return 1;}
        return 0;
    }
    if(sterge(nod->fii[*x-'a'],x+1)==1)
    {
        nod->nrfii--;
        nod->fii[*x-'a']=0;
        if(nod->nrcuv==0 && nod->nrfii==0 && nod!=sol){delete nod;return 1;}
    }
    return 0;
}
int tip(trie* nod,char *x)
{
    if(*x==0)
    {
        return nod->nrcuv;
    }
    if(nod->nrfii==0)
    {
        return 0;
    }
    return tip(nod->fii[*x-'a'],x+1);
}
int pref(trie *nod,char *x)
{
    if(*x==0)
    {
        if(nod->nrcuv)
        return 1;
        return 0;
    }
    if(nod->fii[*x-'a']==0)return 0;
    return pref(nod->fii[*x-'a'],x+1)+1;
}
int main()
{
    sol=new trie;
    while(in>>n>>c)
    {
        if(n==0)add(sol,c);
        if(n==1)sterge(sol,c);
        if(n==2)out<<tip(sol,c)<<'\n';
        if(n==3)out<<pref(sol,c)<<'\n';
    }
    return 0;
}