Cod sursa(job #2518877)

Utilizator mihneacazCazacu Mihnea mihneacaz Data 6 ianuarie 2020 17:55:44
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 kb
#include <fstream>
#include <cstring>
#include <string>

using namespace std;

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

struct TRIE
{
    int frecv;
    int leaves;
    TRIE* next[26];
    TRIE() {
        frecv = 0;
        leaves = 0;
        memset(next, NULL, sizeof(next)); 
    }
};

TRIE *root = new TRIE();

void insert_trie(TRIE *&node, string &s, int cnt)
{
    node -> frecv += 1;
    if(cnt == (int)s.size()) {
        node -> leaves += 1;
    }
    else {
        int curr = s[cnt] - 'a';
        if(node -> next[curr] == nullptr)
            node -> next[curr] = new TRIE();
        insert_trie(node -> next[curr], s, cnt + 1);
    }
}

void remove_trie(TRIE *&node, string &s, int cnt)
{
    node -> frecv -= 1;
    if(cnt == (int)s.size()) {
        node -> leaves -= 1;
        if(node -> frecv == 0) {
            delete node;
            node = nullptr;
        }
        return;
    }
    int curr = s[cnt] - 'a';
    remove_trie(node -> next[curr], s, cnt + 1);
    if(node->frecv == 0 && node != root) {
        delete node;
        node = nullptr;
    }
}

int word_count(string &s)
{
    auto node = root;
    for(auto ch: s) {
        int curr = ch - 'a';
        if(node -> next[curr] == nullptr)
            return 0;
        node = node -> next[curr];
    }
    return node -> leaves;
}

int lcp(string &s)
{
    auto node = root;
    int ans = 0;
    for(auto ch : s) {
        int curr = ch - 'a';
        if(node -> next[curr] == nullptr)
            return ans;
        node = node -> next[curr];
        ans++;
    }
    return ans;
}
int main() {
    int type;
    string s;
    while(cin >> type >> s) {
        if(type == 0)
            insert_trie(root, s, 0);
        else {
            if(type == 1)
                remove_trie(root, s, 0);
            else {
                if(type == 2)
                    cout << word_count(s) << "\n";
                else
                    cout << lcp(s) << "\n";
            }
        }
    }
    return 0;
}