Cod sursa(job #2183486)

Utilizator rnqftwcalina florin daniel rnqftw Data 23 martie 2018 10:44:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
 #include<bits/stdc++.h>

using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");

const int CMax=2e6+3;

struct {
      int pre,cuv;
      int son[30];
}Trie[CMax];

int urm,nr,nod,tip;
string s;

void adauga(){

    nod = 0;

    for(int i=0; i<s.size();++i){
        urm=Trie[nod].son[s[i]-'a'];
        if(!urm){

            urm = ++nr;
            Trie[nod].son[s[i]-'a']=urm;
        }

        ++Trie[urm].pre;
        //cout<<"Trie[nod].pre"<<Trie[urm].pre<< " "<<"urm="<<urm<<endl;
        nod=urm;
    }
    ++Trie[nod].cuv;
}

void sterge(){
    nod = 0;
    for(int i = 0 ; i<s.size() ; ++i){
        urm=Trie[nod].son[s[i]-'a'];
        --Trie[urm].pre;
        nod=urm;
    }

    --Trie[nod].cuv;

}

int nrAparitii(){
    nod = 0;
    for(int i = 0 ; i<s.size() ; ++i){
        urm=Trie[nod].son[s[i]-'a'];
        if(!Trie[urm].pre) return 0;
        nod=urm;
    }

    return Trie[nod].cuv;

}


int prefix(){
    nod = 0;
    for(int i = 0 ; i<s.size() ; ++i){
        urm=Trie[nod].son[s[i]-'a'];
        if(!Trie[urm].pre) return i;
        nod=urm;
    }

   return s.size();

}



int main(){

    while(in>>tip>>s){
        switch(tip){
             case 0: adauga();
                    break;
             case 1: sterge();
                    break;
             case 2:out<<nrAparitii()<<'\n';
                    break;
             case 3:out<<prefix()<<'\n';
                    break;

        }
    }


    return 0;
}