Cod sursa(job #2509702)

Utilizator radugnnGone Radu Mihnea radugnn Data 14 decembrie 2019 16:15:01
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
char c[25];
int cod;
struct nod{
    int fii;
    int cnt;
    nod *f[26];
    nod(){
        cnt=0;
        fii=0;
        for(int i=0; i<26; i++)
            f[i]=0;
    }
};
nod *rad;
void inserare(nod *p, char *c){
    char ch=*c;
    if(ch){
    if (p->f[ch-'a']==NULL) {
            p->f[ch-'a']=new nod;
            p->fii++;
        }
        inserare(p->f[ch-'a'], c+1);
    } else
        p->cnt++;
}
int stergere(nod *&p, char *c){
    char ch=*c;
     if(ch==0){
        p->cnt--;
        if(p->cnt==0 && p->fii==0 && p!=rad){
            delete p;
            p=0;
            return 1;
        }
        return 0;
    }

    if(stergere(p->f[ch-'a'],c+1)){
        p->fii--;
        if(p->cnt==0 && p->fii==0 && p!=rad){
            delete p;
            p=0;
            return 1;
        }
    }
    return 0;
}
int aparitii(nod *p, char *c){
    char ch=*c;
    if (ch==0)
        return p->cnt;
    if (p->f[ch-'a']==NULL)
        return 0;
    return aparitii(p->f[ch-'a'],c+1);
}
int prefix(nod *p, char *c){
    char ch=*c;
    if (ch==0)
        return 0;
    if (p->f[ch-'a']==NULL)
        return 0;

    return 1+prefix(p->f[ch-'a'], c+1);
}
int main(){
    rad=new nod;
    while(fin>>cod){
        fin>>c;
        if(cod==0)
            inserare(rad,c);
        else if(cod==1)
            stergere(rad,c);
        else if(cod==2)
            fout<<aparitii(rad,c)<<"\n";
        else
            fout<<prefix(rad,c)<<"\n";
    }

    return 0;
}