Cod sursa(job #3350570)

Utilizator eric_dragosDragos Eric eric_dragos Data 9 aprilie 2026 19:01:57
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.05 kb
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
struct TrieNode{
    int words, prefixes;
    TrieNode *children[26];
    TrieNode(){
        words = prefixes = 0;
        for(int i = 0; i<26; i++)children[i] = nullptr;
    }
};
struct Trie{
    TrieNode *root;
    Trie(){
        root = new TrieNode();
    }
    void insert(string word){
        TrieNode *node = root;
        for(char c : word){
            int index = c-'a';
            if(!node->children[index]){
                node->children[index] = new TrieNode();
            }
            node->prefixes++;
            node = node->children[index];
        }
        node->words++;
    }
    int countWords(string word){
        TrieNode *node = root;
        for(char c : word){
            int index = c-'a';
            if(!node->children[index] ){
                return 0;
            }
            node = node->children[index];
        }
        return node->words;
    }
    int longestCommonPrefix(string word){
        TrieNode *node = root;
        int len = 0;
        for(char c : word){
            int index = c-'a';
            if(!node->children[index] || node->children[index]->prefixes + node->children[index]->words == 0) return len;
            len++;
            node = node->children[index];
        }
        return len;
    }
    void deleteWord(string word){
        TrieNode *node = root;
        for(char c : word){
            int index = c-'a';
            if(!node->children[index]){
                return;
            }
            node->prefixes--;
            node = node->children[index];
        }
        if(node->words > 0)node->words--;
    }

    
};

int main(){
    int c;string w;
    Trie t;
    while(fin >> c){
        fin >> w;
        if(c == 0)t.insert(w);
        else if(c==1)t.deleteWord(w);
        else if(c==2) fout << t.countWords(w) << '\n';
        else if(c==3) fout << t.longestCommonPrefix(w) << '\n';
    }

    return 0;
}