Cod sursa(job #1802421)

Utilizator RaduMirceaAndreiRadu Mircea Andrei RaduMirceaAndrei Data 10 noiembrie 2016 12:10:05
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
# define DIM 100010
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct trie {
    int inf;
    int fii;
    trie *next[26];

    trie() {
        fii = 0;
        inf=0;
        for (int i=0;i<26;i++)
            next[i] = 0;
    }
};
trie *sursa;
int op,nr;
char s[DIM];
void inserare(trie *r, char *s) {
    if (*s == 0) {
        //notez in r->inf informatia despre sirul meu
        r->inf ++;
    } else {
        if (r->next[*s - 'a'] == NULL) {
            r->next[*s - 'a'] = new trie();
            r->fii ++;
        }
        inserare(r->next[*s - 'a'], s+1);
    }
}

int stergere(trie *&r,char *s){
    if(*s==0){
        r->inf--;
        if(r->inf==0&&r->fii==0&&r!=sursa){
            delete r;
            r=0;
            return 1;
        }
        return 0;
    }
    if(stergere(r->next[*s-'a'],s+1)){
        r->fii--;
        if(r->fii==0&&r->inf==0&&r!=sursa){
            delete r;
            r=0;
            return 1;
        }
    }
    return 0;
}
int aparitii(trie *r,char *s){
    if(*s==0)
        return r->inf;
    if(r->next[*s-'a']==NULL)
        return 0;
    return aparitii(r->next[*s-'a'],s+1);
}
int prefix(trie *r,char *s){
    nr++;
    if (*s == 0) {
        return nr-1;
    } else {
        if (r->next[*s - 'a'] == NULL)
            return nr-1;
        else
            return prefix(r->next[*s - 'a'], s+1);
        }
}
int main () {
    sursa=new trie;
    while(fin>>op>>s){
        if(op==0)
            inserare(sursa,s);
        if(op==1)
            stergere(sursa,s);
        if(op==2)
            fout<<aparitii(sursa,s)<<"\n";
        if(op==3){
            nr=0;
            fout<<prefix(sursa,s)<<"\n";
        }
    }
    return 0;
}