Cod sursa(job #2958020)

Utilizator PHOSSESSEDProsie Radu-Teodor PHOSSESSED Data 24 decembrie 2022 09:16:03
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <bits/stdc++.h>
using namespace std;

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

class Trie {
    struct Node {
        int cnt = 0;
        int lvs = 0;
        int next[26] = {};
    };
    vector<Node> trie{1};

public:
    void insert(const string& str) {
        int node = 0;
        for (char chr : str) {
            if (!trie[node].next[chr - 'a']) {
                trie[node].next[chr - 'a'] = trie.size();
                trie.emplace_back();
            }
            node = trie[node].next[chr - 'a'];
            trie[node].lvs++;
        }
        trie[node].cnt++;
    }

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

    int count(const string& str) {
        int node = 0;
        for (char chr : str) {
            if (!trie[node].next[chr - 'a'])
                return 0;
            node = trie[node].next[chr - 'a'];
        }
        return trie[node].cnt;
    }

    int lcp(const string& str) {
        int node = 0, len = 0;
        for (char chr : str) {
            if (!trie[node].next[chr - 'a'])
                return len;
            node = trie[node].next[chr - 'a'];
            len++;
        }
        return len;
    }
};

int main() {
    Trie trie;
    int type; string str;
    while (fin >> type >> str)
        if (!type)
            trie.insert(str);
        else if (type == 1)
            trie.erase(str);
        else if (type == 2)
            fout << trie.count(str) << '\n';
        else
            fout << trie.lcp(str) << '\n';
    return 0;
}