Cod sursa(job #1351781)

Utilizator j.loves_rockJessica Joanne Patrascu j.loves_rock Data 21 februarie 2015 11:32:31
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include<fstream>
using namespace std;
struct trie{
    int fii;
    int nr;
    trie *f[26];
    trie(){
        nr=fii=0;
        for(int i=0;i<26;i++){
            f[i]=0;
        }
    }
};
trie *r=new trie();
int op;
char s[30];
ifstream fin("trie.in");
ofstream fout("trie.out");
void insertt(trie *nod,char *p){
    if(*p == 0 ){
        nod->nr++;
        return;
    }
    if( *p && nod->f[*p-'a']==0 ){
        nod->f[*p-'a'] = new trie;
        nod->fii++;
    }
    insertt( nod->f[*p-'a'], p+1 );
}
int deletet(trie *&nod, char *p){
    if(*p==0){
        nod->nr--;
        if( nod->fii == 0 && nod->nr == 0 && nod!=r ){
            delete nod;
            nod=0;
            return 1;
        }
        return 0;
    }
    if( deletet( nod->f[*p-'a'], p+1 ) ){
        nod->fii--;
        if( nod->fii == 0 && nod->nr == 0 && nod!=r ){
            delete nod;
            nod=0;
            return 1;
        }
    }
    return 0;
}
int nrt(trie *nod, char *p){
    if(*p==0)
        return nod->nr;
    if( nod->f[*p-'a']==0 )
        return 0;
    return nrt( nod->f[*p-'a'], p+1 );
}
int prefixt(trie *nod, char *p){
    if(*p==0)
        return 0;
    if( nod->f[*p-'a'] == 0 )
        return 0;
    return 1+prefixt(nod->f[*p-'a'],p+1);
}
int main(){
    while(fin>>op>>s){
        if(op==0)
            insertt(r,s);
        if(op==1)
            deletet(r,s);
        if(op==2)
            fout<<nrt(r,s)<<"\n";
        if(op==3)
            fout<<prefixt(r,s)<<"\n";
    }
    return 0;
}