Cod sursa(job #3302560)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 8 iulie 2025 21:27:38
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <bits/stdc++.h>

using namespace std;

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

struct Trie{
    int cnt;
    struct Trie *child[26];
    Trie(){
        cnt = 0;
        for(int i = 0; i < 26; i++){
            child[i] = NULL;
        }
    }
} *root;

bool isempty(Trie* curr){
    if(curr->cnt) return false;
    for(int i = 0; i < 26; i++)
        if(curr->child[i] != NULL) return false;
    return true;
}

Trie* getout(Trie* curr, string s, int depth = 0){
    if(depth == s.size()){
        curr->cnt--;
        if(isempty(curr)){
            delete(curr);
            curr = NULL;
        }
        return curr;
    }
    curr->child[s[depth] - 'a'] = getout(curr->child[s[depth] - 'a'], s, depth + 1);
    if(isempty(curr) && curr != root){ //nu vreau sa sterg root
        delete(curr);
        curr = NULL;
    }
    return curr;
}

signed main()
{
    root = new Trie();

    int c;
    while(fin >> c){
        string s;
        fin >> s;
        if(c == 0){
            Trie *curr = root;
            for(int i = 0; i < s.size(); i++){
                if(curr->child[s[i] - 'a'] == NULL)
                    curr->child[s[i] - 'a'] = new Trie();
                curr = curr->child[s[i] - 'a'];
            }
            curr->cnt++;
        }
        else if(c == 2){
            Trie *curr = root;
            int found = 0;
            for(int i = 0; i < s.size(); i++){
                if(curr->child[s[i] - 'a'] == NULL)
                    break;
                if(i == s.size() - 1) found = 1;
                curr = curr->child[s[i] - 'a'];
            }
            if(found == 0)
                fout << 0 << '\n';
            else
                fout << curr->cnt << '\n';
        }
        else if(c == 3){
            int i = 0;
            Trie *curr = root;
            for(i = 0; i < s.size(); i++){
                if(curr->child[s[i] - 'a'] == NULL)
                    break;
                curr = curr->child[s[i] - 'a'];
            }
            fout << i << '\n';
        }
        else
            getout(root, s);
    }

    return 0;
}