Cod sursa(job #1882395)

Utilizator topala.andreiTopala Andrei topala.andrei Data 17 februarie 2017 10:20:27
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 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,nrfii;
    Trie *fii[26];
    Trie()
    {
        cnt=0,nrfii=0;
        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);
}
int t_delete( Trie *nod, char *s )
{
    if( *s == '\0' )
        nod->cnt --;
    else if( t_delete( nod->fii[ CH ], s+1 ) ) {
            nod->fii[ CH ] = 0;
            nod->nrfii --;
        }

    if( nod->cnt == 0 && nod->nrfii == 0 && nod != T ) {
        delete nod; return 1;
    }
    return 0;
}

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';
    }
}