Cod sursa(job #2469737)

Utilizator NashikAndrei Feodorov Nashik Data 7 octombrie 2019 22:08:34
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
//#include <iostream>
#include <fstream>
using namespace std;
struct Trie{
    int nrcuv,nrfii;
    Trie *fii[30];
    Trie(){
        nrcuv=0;
        nrfii=0;
        for(int j=0;j<=27;j++){
            fii[j]=0;
        }
    }
};
Trie *T= new Trie;
string s;
void ins(Trie *nod,int ind){
    if(ind==s.size()){
        nod->nrcuv++;
    }
    else{
        if(nod->fii[s[ind]-'a']==0){
            nod->nrfii++;
            nod->fii[s[ind]-'a']=new Trie;
        }
        ins(nod->fii[s[ind]-'a'],ind+1);
    }
}
bool del(Trie *nod,int ind){
    if(ind==s.size()){
        nod->nrcuv--;
    }
    else{
        if(del(nod->fii[s[ind]-'a'],ind+1)!=0){
            nod->fii[s[ind]-'a']=0;
            nod->nrfii--;
        }
    }
    if(nod!=T and nod->nrfii==0 and nod->nrcuv==0){
        delete nod;
        return 1;
    }
    return 0;
}
int aparitii(Trie *nod,int ind){
    if(ind==s.size()){
        return nod->nrcuv;
    }
    if(nod->fii[s[ind]-'a']==0)
        return 0;
    return aparitii(nod->fii[s[ind]-'a'],ind+1);
}
int prefix(Trie *nod,int ind){
    if(ind==s.size() or nod->fii[s[ind]-'a']==0)
        return ind;
    return prefix(nod->fii[s[ind]-'a'],ind+1);
}
ifstream cin("trie.in");
ofstream cout("trie.out");
int main()
{
    int a;
    while(cin>>a){
        //cin.get();
        cin>>s;
        //cout<<s<<"\n";
        if(a==0){
            ins(T,0);
        }

        if(a==1){
            del(T,0);
        }
        if(a==2){
            cout<<aparitii(T,0)<<"\n";
        }
        if(a==3){
            cout<<prefix(T,0)<<"\n";
        }

    }
    return 0;
}