Cod sursa(job #1816872)

Utilizator sfechisalin@yahoo.comSfechis Alin [email protected] Data 27 noiembrie 2016 01:39:15
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <bits/stdc++.h>
#define Sigma 26
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char sir[Sigma];
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,start->fii--;
    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.getline(sir,Sigma))
    {
        switch(sir[0])
        {
            case '0':add(T,sir+2);break;
            case '1':del(T,sir+2);break;
            case '2':fout<<Count(T,sir+2)<<"\n";break;
            case '3':fout<<CountPrefix(T,sir+2,0)<<"\n";break;
        }
    }
}