Cod sursa(job #1882264)

Utilizator topala.andreiTopala Andrei topala.andrei Data 17 februarie 2017 01:35:58
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <string.h>
#define CH (*s - 'a')
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct Trie
{
    int cnt=0,nrfii=0;
    Trie *fii[26];
    Trie()
    {
        memset( fii, 0, sizeof( fii ) );
    }
};
Trie *T = new Trie;
void t_insert(Trie *nod,char s[])
{
    if ( *s == '\0' ) {nod->cnt++;return;}
    if(nod->fii[CH] == 0)
    {
        nod->fii[ CH ] = new Trie;
        nod->nrfii++;
    }
    t_insert(nod->fii[CH], s+1);
}
void t_delete(Trie *nod,char s[])
{
    if(*s=='\0') {nod->cnt--;return;}
    t_delete(nod->fii[CH],s+1);
    if (nod->fii[CH]->cnt==0 && nod->fii[CH]->nrfii==0)
    {
        delete nod->fii[CH];
        nod->nrfii--;
    }
}
int t_querry(Trie *nod,char s[])
{
    if(*s=='\0')
        return nod->cnt;
    if(nod->fii[CH])
        return t_querry(nod->fii[CH],s+1);
    return 0;
}
int t_prefix(Trie *nod,char s[],int k)
{
    if( *s == '\0' || nod->fii[ CH ] == 0 ) return k;
    return t_prefix(nod->fii[CH],s+1,k+1);
}
int main()
{
    int op;
    char cuv[36];
    while(f>>op>>cuv)
    {
        if (op==0) t_insert(T,cuv);
        if (op==1) t_delete(T,cuv);
        if (op==2) g<<t_querry(T,cuv)<<'\n';
        if (op==3) g<<t_prefix(T,cuv,0)<<'\n';
    }
}