Cod sursa(job #1955447)

Utilizator ScarymovieMocanu Alexandru Scarymovie Data 5 aprilie 2017 23:24:52
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct nod
{
    int nr,nrfii;
    nod *next[26];
}*rad;
int t;
char s[21];
void adauga(char *s, nod *r)
{
    if(!*s)
    {
        r->nr++;
        return;
    }
    if(r->next[*s-'a']==0)
    {
        r->next[*s-'a']=new nod;
        r->next[*s-'a']->nrfii=0;
        r->next[*s-'a']->nr=0;
        for(int i=0; i<26; i++) r->next[*s-'a']->next[i]=0;
        r->nrfii++;
    }
    adauga(s+1,r->next[*s-'a']);
}
int sterge(char *s, nod *r)
{
    if(!*s) r->nr--;
    else if(sterge(s+1,r->next[*s-'a']))
    {
        r->nrfii--;
        r->next[*s-'a']=0;
    }
    if(r->nr==0 && r->nrfii==0 && r!=rad)
        {
            delete r;
            return 1;
        }
    return 0;
}
int aparitii(char *s, nod *r)
{
    if(!r) return 0;
    if(!*s) return r->nr;
    return aparitii(s+1,r->next[*s-'a']);
}
int prefix(char *s, nod *r,int nr)
{
    if(!*s || r->next[*s-'a']==0) return nr;
    return prefix(s+1,r->next[*s-'a'],nr+1);
}
int main()
{
    rad=new nod;
    rad->nrfii=0;
    rad->nr=0;
    for(int i=0; i<26; i++) rad->next[i]=0;
    while(f>>t)
    {
        f>>s;
        if(!t) adauga(s,rad);
        else if(t==1) sterge(s,rad);
        else if(t==2) g<<aparitii(s,rad)<<'\n';
        else g<<prefix(s,rad,0)<<'\n';
    }
    return 0;
}
/*
*/