Cod sursa(job #3281774)

Utilizator Dragu_AndiDragu Andrei Dragu_Andi Data 3 martie 2025 16:35:19
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.12 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

class TrieNode{
private:
    TrieNode *edg[26];
    int wordsEnded;
    int subtreeSize;
public:
    TrieNode(){
        memset(edg, 0, sizeof(edg));
        wordsEnded = 0;
        subtreeSize = 0;
    }

    void addWord(const string &s, int depth=0){
        subtreeSize++;
        if(depth==s.size())
        {
            wordsEnded++;
            return;
        }
        int nextLetterIdx=s[depth]-'a';
        if(edg[nextLetterIdx]==nullptr){
            edg[nextLetterIdx]= new TrieNode();
        }
        edg[nextLetterIdx] -> addWord(s, depth+1);
    }
    void removeWord(const string &s, int depth=0){
        if(subtreeSize == 0) return;
        subtreeSize--;
        if(depth==s.size())
        {
            wordsEnded--;
            return;
        }
        int nextLetterIdx=s[depth]-'a';
        if (edg[nextLetterIdx] != nullptr) {
            edg[nextLetterIdx]->removeWord(s, depth + 1);
        }
    }
    int countWord(const string &s, int depth=0){
        if(depth==s.size())
        {
            return wordsEnded;
        }
        int nextLetterIdx=s[depth]-'a';
        if (edg[nextLetterIdx] != nullptr) {
            return edg[nextLetterIdx]->countWord(s, depth + 1);
        }
        return 0;
    }
    int lcp(const string &s, int depth=0){
        if(depth==s.size())
            return depth;
        if(subtreeSize==0)
            return depth;
        int nextLetterIdx=s[depth]-'a';
        if (edg[nextLetterIdx] != nullptr && edg[nextLetterIdx]->subtreeSize > 0) {
            return edg[nextLetterIdx]->lcp(s, depth + 1);
        }
        return depth;
    }
};


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

int main()
{
    int q;
    string s;
    TrieNode rt;
    while(fin >> q >> s)
    {
        if(q==0)
            rt.addWord(s);
        else if(q==1)
            rt.removeWord(s);
        else if(q==2)
            fout << rt.countWord(s) << '\n';
        else
            fout << rt.lcp(s) << '\n';

    }
    return 0;
}