Cod sursa(job #2596698)

Utilizator OvidRata Ovidiu Ovid Data 10 aprilie 2020 11:33:44
Problema Trie Scor 45
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.03 kb
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define ft first
#define sc second
#define ll long long
ifstream fin("trie.in"); ofstream fout("trie.out");




vector<vector<pair<int,pair<char, int> > > > trie;


void trie_insert(string s, int p){

    for(int i=0; i<trie[p].size(); i++ ){
        if(trie[p][i].sc.ft==s[0]  ){
            if(s.length()>0 ){
            string k=s;
            k.erase(k.begin(), k.begin()+1);
            trie_insert(k, trie[p][i].sc.sc);
            return ;}
            else{
                trie[p][i].ft++;
                return ;
            }
        }
    }

    if(s.length()>0){
            trie.resize(trie.size()+1 );
        trie[p].pb(mp(0, mp(s[0], trie.size()-1) ) );
    string k=s;
    k.erase(k.begin(), k.begin()+1);
    trie_insert(k, trie[p].back().sc.sc );
    }
    else{
        trie.resize(trie.size()+1 );
        trie[p].pb(mp(1, mp(s[0], trie.size()-1 ) ) );
    }

}



void trie_delete(string s, int p){


    for(int i=0; i<trie[p].size(); i++){
        if(s[0]==trie[p][i].sc.ft){
                if(s.size()>0){
                        string k=s; k.erase(k.begin(), k.begin()+1 );
                    trie_delete(k, trie[p][i].sc.sc );
                    if( trie[trie[p][i].sc.sc].size()<=0){

                        if(trie[p][i].ft<=0){

                        trie[p].erase(trie[p].begin()+i, trie[p].begin()+i+1 );

                    }

                    }




                }
                else{
                    trie[p][i].ft--;


                    if(trie[p][i].ft<=0){



                        trie[p].erase(trie[p].begin()+i, trie[p].begin()+i+1 );

                    }

                }
                return ;
        }

    }


}




int trie_aparitii(string s, int p){

    for(int i=0; i<trie[p].size(); i++){
        if(s[0]==trie[p][i].sc.ft){
            if(s.length()>0){
                string k=s; k.erase(k.begin(), k.begin()+1);
                return trie_aparitii(k, trie[p][i].sc.sc );
            }
            else{
                return trie[p][i].ft;
            }
        }
    }

return 0;
}





int trie_prefix(string s, int p){
int res=0;


    for(int i=0; i<trie[p].size(); i++){
            if(trie[p][i].sc.ft==s[0] && trie[trie[p][i].sc.sc ].size()>0  ){
                if(s.length()>0 ){
                string k=s; k.erase(k.begin(), k.begin()+1);
                res++;
                res+=trie_prefix(k, trie[p][i].sc.sc);

                }
                else{
                    res++;
                }
                return res;
            }


    }



return res;
}







int main(){

trie.resize(1);
while(!fin.eof()){
string s;
int o;
fin>>o>>s;

if(o==0){
    trie_insert(s, 0);
}
if(o==1){
    trie_delete(s, 0);
}
if(o==2){
    fout<<trie_aparitii(s, 0)<<"\n";
}
if(o==3){
    fout<<trie_prefix(s, 0)<<"\n";
}


}




return 0;
}