Cod sursa(job #2293790)

Utilizator racheriunicolaechowchow racheriunicolae Data 1 decembrie 2018 16:24:14
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.81 kb
#include <bits/stdc++.h>

using namespace std;
struct trie{

    int nr , cuv;
    trie *nxt[30];
    trie()
    {
        nr = cuv = 0;
        for(int i = 0; i <= 26; i++)nxt[i] = NULL;
    }
};
void Adauga(trie *p , string s , int pos){

    if(pos == s.size() ){

        p -> cuv++;
        p -> nr++;
        return;
    }
    p -> nr ++;
    char lit = s[pos];
    if(p -> nxt[lit - 'a'] == NULL)
    {
        trie *urm = new trie();
        p -> nxt[lit - 'a'] = urm;
    }
    Adauga(p -> nxt[lit - 'a'] , s , pos + 1);

}
void Sterge(trie *p , string s , int pos){

    if(pos == s.size() )
    {
        p -> cuv--;
        p -> nr --;
        return;
    }
    p -> nr --;
    char lit = s[pos];
    if(p -> nxt[lit - 'a'] == NULL)return;
    Sterge(p -> nxt[lit - 'a']  , s , pos + 1);
}
int Aparitii(trie *p , string s , int pos){

    if(pos == s.size() )
        return p -> cuv;
    char lit = s[pos];
    if(p -> nxt[lit - 'a'] == NULL)return 0;
    return Aparitii(p -> nxt[lit - 'a'] , s , pos + 1);

}
void Pre(trie *p , string s , int pos , int &ans){

    if(p -> nr > 0)ans = max(ans , pos);
    if(pos == s.size()){


        return;
    }
    char lit = s[pos];
    if(p -> nxt[lit - 'a'] == NULL){

      //  ans = max(ans , pos);
        return;
    }
    Pre(p -> nxt[lit - 'a'] , s , pos + 1 , ans);

}
int op , ans;
string s;
int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    trie *t = new trie();
    while(fin >> op >> s)
    {
        if(op == 0)Adauga(t , s , 0);
        if(op == 1)Sterge(t , s , 0);
        if(op == 2)fout << Aparitii(t , s , 0) << "\n";
        if(op == 3){
            ans = 0;
            Pre(t , s , 0 , ans);
            fout << ans  << "\n";
        }
    }
    return 0;
}