Cod sursa(job #1816870)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 27 noiembrie 2016 01:33:19
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <bits/stdc++.h>
#define Sigma 26
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct Trie
{
    int fii, nr_cuv;
    Trie *next[Sigma];
    Trie():fii(0),nr_cuv(0)
    {
        memset(next, 0, sizeof(next));
    }
} *T = new Trie;
void add(Trie *start,char *s)
{
    if(*s==NULL)
    {
        start->nr_cuv++;
        return;
    }
    if(start->next[*s-'a']==NULL)
    {
        start->next[*s-'a']=new Trie;
        start->fii++;
    }
    add(start->next[*s-'a'],s+1);
}
bool del(Trie *start,char *s)
{
    if(*s=='\0')
        start->nr_cuv--;
    else
        if(del(start->next[*s-'a'],s+1))
            start->next[*s-'a']=0;
    if(start->nr_cuv==0 && start->fii==0 && start!=T)
    {
        delete start;
        return true;
    }
    return false;
}
int Count(Trie *start,char *s)
{
    if(*s=='\0')
        return start->nr_cuv;
    if(start->next[*s-'a'])
        return Count(start->next[*s-'a'],s+1);
    return 0;
}
int CountPrefix(Trie *start,char *s,int contor)
{
    if(*s=='\0' || !start->next[*s-'a'])
        return contor;
    return CountPrefix(start->next[*s-'a'],s+1,contor+1);
}
char cuv[1<<5],op;
int main()
{
    while(fin>>op>>cuv)
    {
        switch(op)
        {
            case '0':add(T,cuv);break;
            case '1':del(T,cuv);break;
            case '2':fout<<Count(T,cuv)<<"\n";break;
            case '3':fout<<CountPrefix(T,cuv,0)<<"\n";break;
        }
    }
}