Cod sursa(job #3340404)

Utilizator alexandra_popaa13Popa Alexandra alexandra_popaa13 Data 14 februarie 2026 10:22:40
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <vector>

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

struct Nod
{
    int cnt=0; //cate cuvinte se termina in nodul meu
    int lvs=0; //nr de cuvinte care se termina in subarborele meu
    int next[26]={}; //vector caracteristic
};

vector<Nod> trie;

void insert(string& s)
{
    int nod=0;
    for(char ch:s)
    {
        if(!trie[nod].next[ch-'a']) //daca nu am deja muchie pe care sa fie prima litera din cuvant
        {
            trie[nod].next[ch-'a']=trie.size();
            Nod k;
            trie.push_back(k);
        }
        nod=trie[nod].next[ch-'a'];
        trie[nod].lvs++;
    }
    trie[nod].cnt++;
}

void erase(string& s)
{
    int nod=0;
    for(char ch:s)
        {
         nod=trie[nod].next[ch-'a'];
         trie[nod].lvs--;
        }
    trie[nod].cnt--;
    nod=0;
    for(char ch:s)
        {
         if(!trie[trie[nod].next[ch-'a']].lvs)
            {
             trie[nod].next[ch-'a']=0;
             return;
            }
        nod=trie[nod].next[ch-'a'];
        }
}

int count(string& s)
{
    int nod=0;
    for(char ch:s)
        {
         if(!trie[nod].next[ch-'a'])
            return 0;
         nod=trie[nod].next[ch-'a'];
        }
    return trie[nod].cnt;
}

int lcp(string& s) //longest common prefix
{
    int nod=0;
    int lg=0;
    for(char ch:s)
        {
            if(!trie[nod].next[ch-'a'])
                return lg;
            nod=trie[nod].next[ch-'a'];
            lg++;
        }
    return lg;
}

int main()
{
    int op;
    string s;
    Nod k;
    trie.push_back(k); //push_back la primul nod - radacina
    while(fin>>op>>s)
        {
         if(op==0) insert(s);
            else
            if(op==1) erase(s);
                else
                if(op==2)
                    fout<<count(s)<<'\n';
                    else
                    fout<<lcp(s)<<'\n';
        }
    return 0;
}