Cod sursa(job #1737824)

Utilizator danutbodbodnariuc danut danutbod Data 4 august 2016 22:56:50
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include <cstring>
#define ch (*s-'a')
using namespace std;
ifstream fi("trie.in");
ofstream fo("trie.out");
struct Trie{
    int nr_fii;
    int nr_cuv;
    Trie *fiu[30];
    Trie()
    {
        nr_fii=0;
        nr_cuv=0;
        memset(fiu,0,sizeof(fiu));
    }

};
Trie *T = new Trie;
char s[30];
 void adauga(Trie *nod,char *s)
{
    if(*s==0)
       {
        nod->nr_cuv++; return;
       }
    if(nod->fiu[ch]==NULL)
       {
        nod->fiu[ch]= new Trie;
        nod->nr_fii++;
      }
    adauga(nod->fiu[ch],s+1);
}
 bool sterge(Trie *nod,char *s)
{
    if(*s==0) nod->nr_cuv--;
    else
        if(sterge(nod->fiu[ch],s+1)==1)
        {
            nod->fiu[ch]=0;
            nod->nr_fii--;
        }
    if(nod->nr_fii==0 && nod->nr_cuv==0 && nod!=T)
    {
        delete nod;
        return 1;
    }
    return 0;
}
 int aparitii(Trie *nod, char *s)
{
    if(*s==0)
        return nod->nr_cuv;
    if(nod->fiu[ch]!=0)
        return aparitii(nod->fiu[ch],s+1);
    return 0;
}
 int prefix(Trie *nod,char *s,int k)
{
    if(*s==0 || nod->fiu[ch]==0)
        return k;
    return prefix(nod->fiu[ch],s+1,k+1);
}
int main()
{
    while(fi.getline(s,30))
    {
        if(s[0]=='0')adauga(T,s+2);
        if(s[0]=='1')sterge(T,s+2);
        if(s[0]=='2')fo<<aparitii(T,s+2)<<"\n";
        if(s[0]=='3')fo<<prefix(T,s+2,0)<<"\n";
    }
    return 0;
}