Cod sursa(job #3293796)

Utilizator Nasa1004Ema Nicole Gheorghe Nasa1004 Data 12 aprilie 2025 16:51:48
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.36 kb
#include <fstream>

using namespace std;

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

struct noduri {
    int cnt;
    int fii;
    noduri *v[27];
    noduri() {
        cnt = 0;
        fii = 0;
        for(int i = 0; i < 26; i++)
            v[i] = NULL;
    }
};
noduri *radacina;
///prima pos neparcursa
void add_dfs(noduri *start, string &s, int pos) {
    if(pos == s.size()) {
        start->cnt++;
        return;
    }
    if(start->v[s[pos] - 'a'] == NULL) {
        start->v[s[pos] - 'a'] = new noduri;
        start->fii++;
    }
    add_dfs(start->v[s[pos] - 'a'], s, pos + 1);
}
bool del_dfs(noduri *start, string &s, int pos) { ///true--> am sters
    if(pos == s.size()) {
        start->cnt--;
        if(!start->cnt && !start->fii && start != radacina) {
            delete start;
            return true;
        }
        return false;
    }
    if(del_dfs(start->v[s[pos] - 'a'], s, pos + 1)) { ///dc am sters
        start->v[s[pos] - 'a'] = NULL;
        start->fii--;
        if(!start->cnt && !start->fii && start != radacina) {
            delete start;
            return true;
        }
        return false;
    }
    return false;
}

int ap_dfs(noduri *start, string &s, int pos) {
    if(pos == s.size())
        return start->cnt;
    if(start->v[s[pos] - 'a'] == NULL) ///nu exista
        return 0;
    return ap_dfs(start->v[s[pos] - 'a'], s, pos + 1);
}
int maxx = 0;
void pref_dfs(noduri *start, string &s, int pos) {
    if(start->v[s[pos] - 'a'] == NULL || pos == s.size())
        return;
    maxx = max(maxx, pos + 1);
    pref_dfs(start->v[s[pos] - 'a'], s, pos + 1);
}

int main()
{
    radacina = new noduri;
    int tip;
    string s;
    while(cin >> tip >> s) {
        if(tip == 0)
            add_dfs(radacina, s, 0);
        else if(tip == 1)
            del_dfs(radacina, s, 0);
        else if(tip == 2)
            cout << ap_dfs(radacina, s, 0) << '\n';
        else if(tip == 3) {
            maxx = 0;
            pref_dfs(radacina, s, 0);
            cout << maxx << '\n';
        }
    }
    return 0;
}
/*
0 w - adauga o aparitie a cuvantului w in lista
1 w - sterge o aparitie a cuvantului w din lista
2 w - tipareste numarul de aparitii ale cuvantului w in lista
3 w - tipareste lungimea celui mai lung prefix comun al lui w cu oricare cuvant din lista
*/