Cod sursa(job #2724978)

Utilizator NashikAndrei Feodorov Nashik Data 18 martie 2021 11:02:36
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
//#include <iostream>
#include <fstream>
using namespace std;
const int alfabet=30;
struct Trie{
    int nrcuv,nrfii;
    Trie *fii[alfabet];
    Trie(){
        nrcuv=0;
        nrfii=0;
        for(int i=0;i<alfabet;i++){
            fii[i]=0;
        }
    }
};
Trie *T=new Trie;
void add(Trie *nod,int ind,string s){
    if(ind==s.size()){
        nod->nrcuv++;
        return;
    }
    if(nod->fii[s[ind]-'a']==0){
        nod->nrfii++;
        nod->fii[s[ind]-'a']=new Trie;
    }
    add(nod->fii[s[ind]-'a'],ind+1,s);
}
bool del(Trie *nod,int ind,string s){
    if(ind==s.size()){
        nod->nrcuv--;
    }
    else
    if(del(nod->fii[s[ind]-'a'],ind+1,s)==1){
        nod->fii[s[ind]-'a']=0;
        nod->nrfii--;
    }
    if(nod!=T and nod->nrcuv==0 and nod->nrfii==0){
        delete nod;
        return 1;
    }
    return 0;
}
int aparitii(Trie *nod,int ind,string s){
    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,s);
}
int prefix(Trie *nod,int ind,string s){
    if(ind==s.size() or nod->fii[s[ind]-'a']==0){
        return ind;
    }
    return prefix(nod->fii[s[ind]-'a'],ind+1,s);
}
int main()
{
    ifstream cin("trie.in");
    ofstream cout("trie.out");
    char ch;
    string s;
    while(cin>>ch){
        if(ch=='4')
            break;
        cin>>s;
        if(ch=='0'){
            ///adauga s;
            add(T,0,s);
        }
        if(ch=='1'){
            ///sterge s;
            del(T,0,s);
        }
        if(ch=='2'){
            ///aparitii s;
            cout<<aparitii(T,0,s)<<"\n";
        }
        if(ch=='3'){
            ///cel mai lung prefix s;
            cout<<prefix(T,0,s)<<"\n";
        }
    }
    return 0;
}