Cod sursa(job #2605321)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 24 aprilie 2020 19:04:07
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

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

class TRIE{
private:
    int frec, cntsons;
    TRIE* sons[26];
public:
    TRIE(){
        memset(sons, 0, sizeof(sons));
        cntsons = frec = 0;
    }
    void ADD(string word, int pz){
        int val = word[pz] - 'a';
        if(!sons[val]){
            ++cntsons;
            sons[val] = new TRIE;
        }
        if(pz == word.size() - 1)
            ++sons[val]->frec;
        else sons[val]->ADD(word, pz + 1);
    }
    void ERASE(string word, int pz){
        int val = word[pz] - 'a';
        if(pz == word.size() - 1)
            --sons[val]->frec;
        else sons[val]->ERASE(word, pz + 1);
        if(sons[val]->frec == 0 && sons[val]->cntsons == 0){
            delete sons[val];
            sons[val] = 0;
            --cntsons;
        }
    }
    int COUNT(string word, int pz){
        int val = word[pz] - 'a';
        if(sons[val]){
            if(pz == word.size() - 1)
                return sons[val]->frec;
            else return sons[val]->COUNT(word, pz + 1);
        }
        else return 0;
    }
    int LCMPREFIX(string word, int pz){
        int val = word[pz] - 'a';
        if(sons[val] && pz < word.size())
            return sons[val]->LCMPREFIX(word, pz + 1);
        else return pz;
    }
};

TRIE *root = new TRIE;

int main()
{
    int op;
    string s;
    while(fin >> op >> s){
        if(op == 0)
            root->ADD(s, 0);
        else if(op == 1)
            root->ERASE(s, 0);
        else if(op == 2)
            fout << root->COUNT(s, 0) << '\n';
        else fout << root->LCMPREFIX(s, 0) << '\n';
    }
    return 0;
}